Session Valuation

Theory Valuation1

(**        Valuation1
                            author Hidetsune Kobayashi
                            Group You Santo
                            Department of Mathematics
                            Nihon University
                            h_coba@math.cst.nihon-u.ac.jp
                            June 24, 2005(revised)
                            July 20, 2007(revised)

   chapter 1. elementary properties of a valuation
    section 1. definition of a valuation
    section 2. the normal valuation of v
    section 3. valuation ring
    section 4. ideals in a valuation ring
    section 5. pow of vp and n_value -- convergence --
    section 6. equivalent valuations
    section 7. prime divisors
    section 8. approximation

   **)


theory Valuation1
imports  "Group-Ring-Module.Algebra9"
begin

declare ex_image_cong_iff [simp del]

chapter "Preliminaries"

section "Int and ant (augmented integers)"

lemma int_less_mono:"(a::nat) < b  int a < int b"
apply simp
done

lemma zless_trans:"(i::int) < j; j < k  i < k"
apply simp
done

lemma zmult_pos_bignumTr0:"L. m. L < m  z < x + int m"
by (subgoal_tac "m. (nat((abs z) + (abs x))) < m  z < x + int m",
       blast, rule allI, rule impI, arith)

lemma zle_less_trans:"(i::int)  j; j < k  i < k"
apply (simp add:less_le)
done

lemma  zless_le_trans:"(i::int) < j; j  k  i < k"
apply (simp add:less_le)
done

lemma zmult_pos_bignumTr:"0 < (a::int) 
                   l. m. l < m  z < x + (int m) * a"
apply (cut_tac zmult_pos_bignumTr0[of "z" "x"])
 apply (erule exE)
 apply (subgoal_tac "m. L < m  z < x + int m * a", blast)
apply (rule allI, rule impI)
 apply (drule_tac a = m in forall_spec, assumption)
 apply (subgoal_tac "0  int m")
 apply (frule_tac a = "int m" and b = a in pos_zmult_pos, assumption)
 apply (cut_tac order_refl[of "x"])
 apply (frule_tac z' = "int m" and z = "int m * a" in
         zadd_zle_mono[of "x" "x"], assumption+)
 apply (rule_tac y = "x + int m" and z = "x + (int m)* a" in
         less_le_trans[of "z"], assumption+)
 apply simp
done

lemma  ale_shift:"(x::ant) y; y = z  x  z"
by simp

lemma aneg_na_0[simp]:"a < 0  na a = 0"
by (simp add:na_def)

lemma amult_an_an:"an (m * n) = (an m) * (an n)"
apply (simp add:an_def)
apply (simp add: of_nat_mult a_z_z)
done

definition
  adiv :: "[ant, ant]  ant" (infixl "adiv" 200) where
  "x adiv y = ant ((tna x) div (tna y))"

definition
  amod :: "[ant, ant]  ant" (infixl "amod" 200) where
  "x amod y = ant ((tna x) mod (tna y))"

lemma apos_amod_conj:"0 < ant b 
                  0  (ant a) amod (ant b)  (ant a) amod (ant b) < (ant b)"
by (simp add:amod_def tna_ant, simp only:ant_0[THEN sym],
       simp add:aless_zless)

lemma  amod_adiv_equality:
       "(ant a) = (a div b) *a (ant b) + ant (a mod b)"
apply (simp add:adiv_def tna_ant a_z_z a_zpz  asprod_mult)
done

lemma asp_z_Z:"z *a ant x  Z"
by (simp add:asprod_mult z_in_aug_inf)

lemma apos_in_aug_inf:"0  a  a  Z"
by (simp add:aug_inf_def, rule contrapos_pp, simp+,
    cut_tac minf_le_any[of "0"], frule ale_antisym[of "0" "-"],
    assumption+, simp)

lemma  amult_1_both:"0 < (w::ant); x * w = 1  x = 1  w = 1"
apply (cut_tac mem_ant[of "x"], cut_tac mem_ant[of "w"],
      (erule disjE)+, simp,
      (frule sym, thin_tac " = 1", simp only:ant_1[THEN sym],
       simp del:ant_1))
apply (erule disjE, erule exE, simp,
       (frule sym, thin_tac "- = 1", simp only:ant_1[THEN sym],
       simp del:ant_1), simp)
apply (frule sym, thin_tac "- = 1", simp only:ant_1[THEN sym],
       simp del:ant_1)
apply ((erule disjE)+, erule exE, simp,
       frule_tac aless_imp_le[of "0" "-"],
       cut_tac minf_le_any[of "0"],
       frule ale_antisym[of "0" "-"], assumption+,
       simp only:ant_0[THEN sym], simp,
       frule sym, thin_tac "- = 1", simp only:ant_1[THEN sym],
       simp del:ant_1)
apply ((erule disjE)+, (erule exE)+, simp only:ant_1[THEN sym],
       simp del:ant_1 add:a_z_z,
       (cut_tac a = z and b = za in mult.commute, simp,
        cut_tac z = za and z' = z in  times_1_both, assumption+),
       simp)
apply (erule exE, simp,
       cut_tac x = z and y = 0 in less_linear, erule disjE, simp,
       frule sym, thin_tac "- = 1", simp only:ant_1[THEN sym],
       simp del:ant_1,
       erule disjE, simp add:ant_0, simp,
       frule sym, thin_tac " = 1", simp only:ant_1[THEN sym],
       simp del:ant_1,
       erule disjE, erule exE, simp,
       frule sym, thin_tac " = 1", simp only:ant_1[THEN sym],
       simp del:ant_1, simp)
done

lemma poss_int_neq_0:"0 < (z::int)  z  0"
by simp

lemma aadd_neg_negg[simp]:"a  (0::ant); b < 0  a + b < 0"
apply (frule ale_minus[of "a" "0"], simp,
       frule aless_minus[of "b" "0"], simp)
apply (frule aadd_pos_poss[of "-a" "-b"], assumption+,
       simp add:aminus_add_distrib[THEN sym, of "a" "b"],
       frule aless_minus[of "0" "-(a + b)"], simp add:a_minus_minus)
done

lemma aadd_two_negg[simp]:"a < (0::ant); b < 0  a + b < 0"
by auto

lemma amin_aminTr:"(z::ant)  z'  amin z w  amin z' w"
by (simp add:amin_def, simp add:aneg_le,
      (rule impI)+, frule aless_le_trans[of "w" "z" "z'"],
      assumption+, simp)

lemma amin_le1:"(z::ant)  z'  (amin z w)  z'"
by (simp add:amin_def, simp add:aneg_le,
       rule impI, frule aless_le_trans[of "w" "z" "z'"],
       assumption+, simp add:aless_imp_le)

lemma amin_le2:"(z::ant)  z'  (amin w z)  z'"
by (simp add:amin_def, rule impI,
       frule ale_trans[of "w" "z" "z'"], assumption+)

lemma  Amin_geTr:"(j  n. f j  Z)  (j  n. z  (f j)) 
                                 z  (Amin n f)"
apply (induct_tac n)
 apply (rule impI, erule conjE, simp)
apply (rule impI, (erule conjE)+,
       cut_tac Nsetn_sub_mem1[of n], simp,
       drule_tac x = "Suc n" in spec, simp,
       rule_tac z = z and x = "Amin n f" and y = "f(Suc n)" in amin_ge1,
       simp+)
done

lemma Amin_ge:"j  n. f j  Z; j  n. z  (f j) 
                             z  (Amin n f)"
by (simp add:Amin_geTr)

definition
  Abs :: "ant  ant" where
  "Abs z = (if z < 0 then -z else z)"

lemma Abs_pos:"0  Abs z"
by (simp add:Abs_def, rule conjI, rule impI,
       cut_tac aless_minus[of "z" "0"], simp,
       assumption,
       rule impI, simp add:aneg_less[of "z" "0"])

lemma Abs_x_plus_x_pos:"0  (Abs x) + x"
apply (case_tac "x < 0",
       simp add:Abs_def, simp add:aadd_minus_inv)

apply (simp add:aneg_less,
       simp add:Abs_def, simp add:aneg_less[THEN sym, of "0" "x"],
       simp add:aneg_less[of "x" "0"], simp add:aadd_two_pos)
done

lemma  Abs_ge_self:"x  Abs x"
apply (simp add:Abs_def, rule impI,
       cut_tac ale_minus[of "x" "0"],
       simp add:aminus_0, simp add:aless_imp_le)
done

lemma  na_1:"na 1 = Suc 0"
apply (simp only:ant_1[THEN sym], simp only:na_def,
       simp only:ant_0[THEN sym], simp only:aless_zless[of "1" "0"],
       simp, subgoal_tac "  1", simp)
apply (simp only:ant_1[THEN sym], simp only:tna_ant,
       rule not_sym, simp only:ant_1[THEN sym], simp del:ant_1)
done

lemma ant_int:"ant (int n) = an n"
by (simp add:an_def)

lemma int_nat:"0 < z  int (nat z) = z"
by arith

lemma int_ex_nat:"0 < z  n. int n = z"
by (cut_tac int_nat[of z], blast, assumption)

lemma eq_nat_pos_ints:
  "nat (z::int) = nat (z'::int); 0  z; 0  z'  z = z'"
by simp

lemma a_p1_gt[simp]:"a  ; a  -   a < a + 1"
apply (cut_tac aadd_poss_less[of a 1],
       simp add:aadd_commute, assumption+)
apply (cut_tac zposs_aposss[of 1], simp)
done

lemma  gt_na_poss:"(na a) < m  0 < m"
apply (simp add:na_def)
done

lemma azmult_less:"a  ; na a < m; 0 < x
                          a < int m *a x"
apply (cut_tac mem_ant[of "a"])
 apply (erule disjE)
 apply (case_tac "x = ") apply simp
 apply (subst less_le[of "-" ""]) apply simp
 apply (frule aless_imp_le[of "0" "x"], frule apos_neq_minf[of "x"])
 apply (cut_tac mem_ant[of "x"], simp, erule exE, simp)
 apply (simp add:asprod_amult a_z_z)
apply (simp, erule exE, simp)

apply (frule_tac a = "ant z" in gt_na_poss[of _ "m"])
 apply (case_tac "x = ", simp)
 apply (frule aless_imp_le[of "0" "x"])
 apply (frule apos_neq_minf[of "x"])
 apply (cut_tac mem_ant[of "x"], simp, erule exE,
        simp add:asprod_amult a_z_z)
 apply (subst aless_zless)
 apply (cut_tac a = "ant z" in gt_na_poss[of _ "m"], assumption)
 apply (smt a0_less_int_conv aposs_na_poss int_less_mono int_nat na_def of_nat_0_le_iff pos_zmult_pos tna_ant z_neq_inf)
 done

lemma  zmult_gt_one:"2  m; 0 < xa  1 < int m * xa"
by (metis ge2_zmult_pos mult.commute)

lemma zmult_pos:" 0 < m; 0 < (a::int)  0 < (int m) * a"
by (frule zmult_zless_mono2[of "0" "a" "int m"], simp, simp)

lemma  ant_int_na:"0  a; a     ant (int (na a)) = a"
by (frule an_na[of "a"], assumption, simp add:an_def)

lemma zpos_nat:"0  (z::int)  n. z = int n"
apply (subgoal_tac "z = int (nat z)")
apply blast apply simp
done

section "nsets"

lemma nsetTr1:"j  nset a b; j  a  j  nset (Suc a) b"
apply (simp add:nset_def)
done

lemma nsetTr2:"j  nset (Suc a) (Suc b)  j - Suc 0  nset a b"
apply (simp add:nset_def, erule conjE,
       simp add:skip_im_Tr4[of "j" "b"])
done

lemma  nsetTr3:"j  Suc (Suc 0); j - Suc 0  nset (Suc 0) (Suc n)
         Suc 0 < j - Suc 0"
apply (simp add:nset_def, erule conjE, subgoal_tac "j  0",
       rule contrapos_pp, simp+)
done

lemma Suc_leD1:"Suc m  n  m < n"
apply (insert lessI[of "m"],
       rule less_le_trans[of "m" "Suc m" "n"], assumption+)
done

lemma leI1:"n < m  ¬ ((m::nat)  n)"
apply (rule contrapos_pp, simp+)
done

lemma neg_zle:"¬ (z::int)  z'  z' < z"
apply (simp add: not_le)
done

lemma nset_m_m:"nset m m = {m}"
by (simp add:nset_def,
       rule equalityI, rule subsetI, simp,
       rule subsetI, simp)

lemma nset_Tr51:"j  nset (Suc 0) (Suc (Suc n)); j  Suc 0
        j - Suc 0  nset (Suc 0) (Suc n)"
apply (simp add:nset_def, (erule conjE)+,
       frule_tac m = j and n = "Suc (Suc n)" and l = "Suc 0" in diff_le_mono,
       simp)
done

lemma nset_Tr52:"j  Suc (Suc 0); Suc 0  j - Suc 0
        ¬ j - Suc 0  Suc 0"
by auto

lemma nset_Suc:"nset (Suc 0) (Suc (Suc n)) =
                  nset (Suc 0) (Suc n)  {Suc (Suc n)}"
by (auto simp add:nset_def)

lemma AinequalityTr0:"x  -  L. (N. L < N 
                          (an m) < (x + an N))"
apply (case_tac "x = ", simp add:an_def)
apply (cut_tac mem_ant[of "x"], simp, erule exE, simp add:an_def a_zpz,
       simp add:aless_zless,
       cut_tac x = z in zmult_pos_bignumTr0[of "int m"], simp)
done

lemma AinequalityTr:"0 < b  b  ; x  -  L. (N. L < N 
                          (an m) < (x + (int N) *a b))"
apply (frule_tac AinequalityTr0[of "x" "m"],
       erule exE,
       subgoal_tac "N. L < N  an m < x + (int N) *a b",
       blast, rule allI, rule impI)
apply (drule_tac a = N in forall_spec, assumption,
       erule conjE,
       cut_tac N = N in asprod_ge[of "b"], assumption,
       thin_tac "x  - ", thin_tac "b  ", thin_tac "an m < x + an N",
        simp)
 apply (frule_tac x = "an N" and y = "int N *a b" and z = x in aadd_le_mono,
        simp only:aadd_commute[of _ "x"])
done

lemma two_inequalities:"(n::nat). x < n  P n; (n::nat). y < n  Q n
   n. (max x y) < n  (P n)  (Q n)"
by auto

lemma multi_inequalityTr0:"(j  (n::nat). (x j)  - ) 
      (L. (N. L < N   (l  n. (an m) < (x l) + (an N))))"
apply (induct_tac n)
 apply (rule impI, simp)
 apply (rule AinequalityTr0[of "x 0" "m"], assumption)
(** n **)
apply (rule impI)
 apply (subgoal_tac "l. l  n  l  (Suc n)", simp)
 apply (erule exE)
 apply (frule_tac a = "Suc n" in forall_spec, simp)

 apply (frule_tac x = "x (Suc n)" in AinequalityTr0[of _ "m"])
 apply (erule exE)
 apply (subgoal_tac "N. (max L La) < N 
                 (l  (Suc n). an m < x l + an N)", blast)
 apply (rule allI, rule impI, rule allI, rule impI)
 apply (rotate_tac 1)
 apply (case_tac "l = Suc n", simp,
        drule_tac m = l and n = "Suc n" in noteq_le_less, assumption+,
        drule_tac x = l and n = "Suc n" in less_le_diff, simp,
        simp)
done

lemma multi_inequalityTr1:"j  (n::nat). (x j)  -  
       L. (N. L < N   (l  n. (an m) < (x l) + (an N)))"
by (simp add:multi_inequalityTr0)

lemma gcoeff_multi_inequality:"N. 0 < N  (j  (n::nat). (x j)  - 
     0 < (b N j)  (b N j)  ) 
L. (N. L < N   (l  n.(an m) < (x l) + (int N) *a (b N l)))"
apply (subgoal_tac "j  n. x j  - ")
apply (frule  multi_inequalityTr1[of "n" "x" "m"])
apply (erule exE)
apply (subgoal_tac "N. L < N 
                     (l  n. an m < x l + (int N) *a (b N l))")
apply blast

apply (rule allI, rule impI, rule allI, rule impI,
       drule_tac a = N in forall_spec, simp,
       drule_tac a = l in forall_spec, assumption,
       drule_tac a = N in forall_spec, assumption,
       drule_tac a = l in forall_spec, assumption,
       drule_tac a = l in forall_spec, assumption)
 apply (cut_tac b = "b N l" and N = N in asprod_ge, simp, simp,
        (erule conjE)+, simp, thin_tac "x l  - ", thin_tac "b N l  ")
apply (frule_tac x = "an N" and y = "int N *a b N l" and z = "x l" in
       aadd_le_mono, simp add:aadd_commute,
       rule allI, rule impI,
       cut_tac lessI[of "(0::nat)"],
       drule_tac a = "Suc 0" in forall_spec, assumption)
 apply simp
done

primrec m_max :: "[nat, nat  nat]  nat"
where
  m_max_0: "m_max 0 f = f 0"
| m_max_Suc: "m_max (Suc n) f  = max (m_max n f) (f (Suc n))"

   (** maximum value of f **)

lemma m_maxTr:"l  n. (f l)  m_max n f"
apply (induct_tac n)
 apply simp

apply (rule allI, rule impI)
 apply simp
 apply (case_tac "l = Suc n", simp)
 apply (cut_tac m = l and n = "Suc n" in noteq_le_less, assumption+,
        thin_tac "l  Suc n", thin_tac "l  Suc n",
        frule_tac x = l and n = "Suc n" in less_le_diff,
        thin_tac "l < Suc n", simp)
 apply (drule_tac a = l in forall_spec, assumption)
 apply simp
done

lemma m_max_gt:"l  n  (f l)  m_max n f"
apply (simp add:m_maxTr)
done

lemma ASum_zero:" (j  n. f j  Z)  (l  n. f l = 0)  ASum f n = 0"
apply (induct_tac n)
apply (rule impI, erule conjE, simp)
apply (rule impI)
apply (subgoal_tac "(jn. f j  Z)  (ln. f l = 0)", simp)
 apply (simp add:aadd_0_l, erule conjE,
        thin_tac "(jn. f j  Z)  (ln. f l = 0)  ASum f n = 0")
 apply (rule conjI)
 apply (rule allI, rule impI,
        drule_tac a = j in forall_spec, simp, assumption+)
 apply (thin_tac "jSuc n. f j  Z")
 apply (rule allI, rule impI,
        drule_tac a = l in forall_spec, simp+)
done

lemma eSum_singleTr:"(j  n. f j  Z)  (j  n  (l {h. h  n} - {j}. f l = 0))   ASum f n = f j"
apply (induct_tac n)
 apply (simp, rule impI, (erule conjE)+)
 apply (case_tac "j  n")
 apply simp
 apply (simp add:aadd_0_r)
 apply simp
 apply (simp add:nat_not_le_less[of j])
 apply (frule_tac m = n and n = j in Suc_leI)
 apply (frule_tac m = j and n = "Suc n" in le_antisym, assumption+, simp)
 apply (cut_tac n = n in ASum_zero [of _ "f"])
 apply (subgoal_tac "(jn. f j  Z)  (ln. f l = 0)")
 apply (thin_tac "jSuc n. f j  Z",
        thin_tac "l{h. h  Suc n} - {Suc n}. f l = 0", simp only:mp)
 apply (simp add:aadd_0_l)

 apply (thin_tac "(jn. f j  Z)  (ln. f l = 0)  ASum f n = 0")
 apply (rule conjI,
        thin_tac "l{h. h  Suc n} - {Suc n}. f l = 0", simp)
 apply (thin_tac "jSuc n. f j  Z", simp)
done

lemma eSum_single:"j  n. f j  Z ; j  n; l  {h. h  n} - {j}. f l = 0
  ASum  f n = f j"
apply (simp add:eSum_singleTr)
done

lemma ASum_eqTr:"(j  n. f j  Z)  (j  n. g j  Z) 
                (j  n. f j = g j)  ASum f n = ASum g n"
apply (induct_tac n)
 apply (rule impI, simp)

apply (rule impI, (erule conjE)+)
apply simp
done

lemma ASum_eq:"j  n. f j  Z; j  n. g j  Z; j  n. f j = g j 
               ASum f n = ASum g n"
by (cut_tac ASum_eqTr[of n f g], simp)


definition
  Kronecker_delta :: "[nat, nat]  ant"
    ("(δ⇘_ _)" [70,71]70) where
  i j = (if i = j then 1 else 0)"

definition
  K_gamma :: "[nat, nat]  int"
    ("(γ⇘_ _)" [70,71]70) where
  i j = (if i = j then 0 else 1)"

abbreviation
  TRANSPOS  ("(τ⇘_ _)" [90,91]90) where
  i j == transpos i j"

lemma Kdelta_in_Zinf:"j  (Suc n); k  (Suc n)  
                 z *a (δj k)  Z"
apply (simp add:Kronecker_delta_def)
apply (simp add:z_in_aug_inf Zero_in_aug_inf)
apply (simp add:asprod_n_0 Zero_in_aug_inf)
done

lemma Kdelta_in_Zinf1:"j  n; k  n   δj k  Z"
apply (simp add:Kronecker_delta_def)
apply (simp add:z_in_aug_inf Zero_in_aug_inf)
apply (rule impI)
apply (simp only:ant_1[THEN sym], simp del:ant_1 add:z_in_aug_inf)
done

primrec m_zmax :: "[nat, nat  int]  int"
where
  m_zmax_0: "m_zmax 0 f = f 0"
| m_zmax_Suc: "m_zmax (Suc n) f = zmax (m_zmax n f) (f (Suc n))"

lemma m_zmax_gt_eachTr:
      "(j  n. f j  Zset)  (j  n. (f j)  m_zmax n f)"
apply (induct_tac n)
apply (rule impI, rule allI, rule impI, simp)
 apply (rule impI)
 apply simp
 apply (rule allI, rule impI)
 apply (case_tac "j = Suc n", simp)
 apply (simp add:zmax_def)
 apply (drule_tac m = j and n = "Suc n" in noteq_le_less, assumption,
        drule_tac x = j and n = "Suc n" in less_le_diff, simp)
 apply (drule_tac a = j in forall_spec, assumption)
 apply (simp add:zmax_def)
done

lemma m_zmax_gt_each:"(j  n. f j  Zset)  (j  n. (f j)  m_zmax n f)"
apply (simp add:m_zmax_gt_eachTr)
done

lemma n_notin_Nset_pred:" 0 < n  ¬ n  (n - Suc 0)"
apply simp
done

lemma Nset_preTr:"0 < n; j  (n - Suc 0)  j  n"
apply simp
done

lemma Nset_preTr1:"0 < n; j  (n - Suc 0)  j  n"
apply simp
done

lemma transpos_noteqTr:"0 < n; k  (n - Suc 0); j  n; j  n
                     j  (τj n) k"
apply (rule contrapos_pp, simp+)
 apply (simp add:transpos_def)
 apply (case_tac "k = j", simp, simp)
 apply (case_tac "k = n", simp)
 apply (simp add:n_notin_Nset_pred)
done

chapter "Elementary properties of a valuation"


section "Definition of a valuation"

definition
  valuation :: "[('b, 'm) Ring_scheme, 'b  ant]  bool" where
  "valuation K v 
     v  extensional (carrier K) 
     v  carrier K  Z  
     v (𝟬K) =   (x((carrier K) - {𝟬K}). v x  ) 
    (x(carrier K). y(carrier K). v (x rK y) = (v x) + (v y)) 
    (x(carrier K). 0  (v x)  0  (v (1rK ±K x))) 
    (x. x  carrier K  (v x)    (v x)  0)"

lemma (in Corps) invf_closed:"x  carrier K - {𝟬}  xK  carrier K"
by (cut_tac invf_closed1[of x], simp, assumption)

lemma (in Corps) valuation_map:"valuation K v  v  carrier K  Z"
by (simp add:valuation_def)

lemma (in Corps) value_in_aug_inf:"valuation K v; x  carrier K 
       v x  Z"
by (simp add:valuation_def, (erule conjE)+, simp add:funcset_mem)

lemma (in Corps) value_of_zero:"valuation K v   v (𝟬) = "
by (simp add:valuation_def)

lemma (in Corps) val_nonzero_noninf:"valuation K v; x  carrier K; x  𝟬
      (v x)  "
by (simp add:valuation_def)

lemma (in Corps) value_inf_zero:"valuation K v; x  carrier K; v x = 
      x = 𝟬"
by (rule contrapos_pp, simp+,
    frule val_nonzero_noninf[of v x], assumption+, simp)

lemma (in Corps) val_nonzero_z:"valuation K v; x  carrier K; x  𝟬 
                      z. (v x) = ant z"
by (frule value_in_aug_inf[of v x], assumption+,
    frule val_nonzero_noninf[of v x], assumption+,
    cut_tac mem_ant[of "v x"],  simp add:aug_inf_def)

lemma (in Corps) val_nonzero_z_unique:"valuation K v; x  carrier K; x  𝟬
        ∃!z. (v x) = ant z"
by (rule ex_ex1I, simp add:val_nonzero_z, simp)

lemma (in Corps) value_noninf_nonzero:"valuation K v; x  carrier K; v x  
          x  𝟬"
by (rule contrapos_pp, simp+, simp add:value_of_zero)

lemma (in Corps) val1_neq_0:"valuation K v; x  carrier K; v x = 1 
                                         x  𝟬"
apply (rule contrapos_pp, simp+, simp add:value_of_zero)
apply (simp only:ant_1[THEN sym], cut_tac z_neq_inf[THEN not_sym, of 1], simp)
done

lemma (in Corps) val_Zmin_sym:"valuation K v; x  carrier K; y  carrier K
                   amin (v x) (v y) = amin (v y ) (v x)"
by (simp add:amin_commute)

lemma (in Corps) val_t2p:"valuation K v; x  carrier K; y  carrier K
                          v (x r y ) = v x + v y"
by (simp add:valuation_def)

lemma (in Corps) val_axiom4:"valuation K v; x  carrier K; 0  v x 
                      0  v (1r ± x)"
by (simp add:valuation_def)

lemma (in Corps) val_axiom5:"valuation K v 
                  x. x  carrier K  v x    v x  0"
by (simp add:valuation_def)

lemma (in Corps) val_field_nonzero:"valuation K v  carrier K  {𝟬}"
by (rule contrapos_pp, simp+,
       frule val_axiom5[of v],
       erule exE, (erule conjE)+, simp add:value_of_zero)

lemma (in Corps) val_field_1_neq_0:"valuation K v  1r  𝟬"
apply (rule contrapos_pp, simp+)
apply (frule val_axiom5[of v])
apply (erule exE, (erule conjE)+)
apply (cut_tac field_is_ring,
       frule_tac t = x in  Ring.ring_l_one[THEN sym, of "K"], assumption+,
       simp add:Ring.ring_times_0_x, simp add:value_of_zero)
done

lemma (in Corps) value_of_one:"valuation K v  v (1r) = 0"
apply (cut_tac field_is_ring, frule Ring.ring_one[of "K"])
apply (frule val_t2p[of v "1r" "1r"], assumption+,
       simp add:Ring.ring_l_one, frule val_field_1_neq_0[of v],
       frule val_nonzero_z[of v "1r"], assumption+,
       erule exE, simp add:a_zpz)
done

lemma (in Corps) has_val_one_neq_zero:"valuation K v  1r  𝟬"
by (frule value_of_one[of "v"],
       rule contrapos_pp, simp+, simp add:value_of_zero)

lemma (in Corps) val_minus_one:"valuation K v  v (-a 1r) = 0"
apply (cut_tac field_is_ring, frule Ring.ring_one[of "K"],
       frule Ring.ring_is_ag[of "K"],
       frule val_field_1_neq_0[of v],
       frule aGroup.ag_inv_inj[of "K" "1r" "𝟬"], assumption+,
       simp add:Ring.ring_zero, assumption)
 apply (frule val_nonzero_z[of v "-a 1r"],
        rule aGroup.ag_mOp_closed, assumption+, simp add:aGroup.ag_inv_zero,
        erule exE, frule val_t2p [THEN sym, of v "-a 1r" "-a 1r"])
apply (simp add:aGroup.ag_mOp_closed[of "K" "1r"],
       simp add:aGroup.ag_mOp_closed[of "K" "1r"],
       frule Ring.ring_inv1_3[THEN sym, of "K" "1r" "1r"], assumption+,
       simp add:Ring.ring_l_one, simp add:value_of_one a_zpz)
done

lemma (in Corps) val_minus_eq:"valuation K v; x  carrier K 
                            v (-a x) = v x"
apply (cut_tac field_is_ring,
     simp add:Ring.ring_times_minusl[of K x],
     subst val_t2p[of v], assumption+,
     frule Ring.ring_is_ag[of "K"], rule aGroup.ag_mOp_closed, assumption+,
     simp add:Ring.ring_one, assumption, simp add:val_minus_one,
     simp add:aadd_0_l)
done

lemma (in Corps) value_of_inv:"valuation K v; x  carrier K; x  𝟬 
                        v (xK) = - (v x)"
apply (cut_tac invf_inv[of x], erule conjE,
       frule val_t2p[of v "xK" x], assumption+,
       simp+, simp add:value_of_one, simp add:a_inv)
apply simp
done

lemma (in Corps) val_exp_ring:" valuation K v; x  carrier K; x  𝟬
            (int n) *a (v x) = v (x^K n)"
apply (cut_tac field_is_ring,
       induct_tac n, simp add:Ring.ring_r_one, simp add:value_of_one)
apply (drule sym, simp)
apply (subst val_t2p[of v _ x], assumption+,
       rule Ring.npClose, assumption+,
       frule val_nonzero_z[of v x], assumption+,
              erule exE, simp add:asprod_mult a_zpz,
       simp add: distrib_right)
done

text‹exponent in a field›
lemma (in Corps) val_exp:" valuation K v; x  carrier K; x  𝟬 
                        z *a (v x) = v (xKz)"
apply (simp add:npowf_def)
apply (case_tac "0  z",
       simp, frule val_exp_ring [of v x "nat z"], assumption+,
       simp, simp)
 apply (simp add:zle,
       cut_tac invf_closed1[of x], simp,
       cut_tac  val_exp_ring [THEN sym, of v "xK" "nat (- z)"], simp,
       thin_tac "v (xK^K (nat (- z))) = (- z) *a v (xK)", erule conjE)
 apply (subst value_of_inv[of v x], assumption+)
 apply (frule val_nonzero_z[of v x], assumption+, erule exE, simp,
       simp add:asprod_mult aminus, simp+)
done

lemma (in Corps) value_zero_nonzero:"valuation K v; x  carrier K; v x = 0
                    x  𝟬"
by (frule value_noninf_nonzero[of v x], assumption+, simp,
        assumption)

lemma (in Corps) v_ale_diff:"valuation K v; x  carrier K; y  carrier K;
        x  𝟬; v x  v y   0  v(y r xK)"
apply (frule value_in_aug_inf[of v x], simp+,
       frule value_in_aug_inf[of v y], simp+,
       frule val_nonzero_z[of v x], assumption+,
       erule exE)
apply (cut_tac invf_closed[of x], simp+,
       simp add:val_t2p,
       simp add:value_of_inv[of v "x"],
       frule_tac x = "ant z" in ale_diff_pos[of _ "v y"],
       simp add:diff_ant_def)
apply simp
done

lemma (in Corps) amin_le_plusTr:"valuation K v; x  carrier K; y  carrier K;
       v x  ; v y  ; v x  v y  amin (v x) (v y)  v ( x ± y)"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag,
       frule value_noninf_nonzero[of v x], assumption+,
       frule v_ale_diff[of v x y], assumption+,
       cut_tac invf_closed1[of x],
       frule Ring.ring_tOp_closed[of K y "xK"], assumption+, simp,
       frule Ring.ring_one[of "K"],
       frule aGroup.ag_pOp_closed[of "K" "1r" "y r xK"], assumption+,
       frule val_axiom4[of v "y r ( xK)"], assumption+)
apply (frule aadd_le_mono[of "0" "v (1r ± y r xK)" "v x"],
       simp add:aadd_0_l, simp add:aadd_commute[of _ "v x"],
       simp add:val_t2p[THEN sym, of v x],
       simp add:Ring.ring_distrib1 Ring.ring_r_one,
       simp add:Ring.ring_tOp_commute[of "K" "x"],
       simp add:Ring.ring_tOp_assoc, simp add:linvf,
       simp add:Ring.ring_r_one,
       cut_tac amin_le_l[of "v x" "v y"],
       rule ale_trans[of "amin (v x) (v y)" "v x" "v (x ± y)"], assumption+)
apply simp
done

lemma (in Corps) amin_le_plus:"valuation K v; x  carrier K; y  carrier K
                    (amin (v x) (v y))  (v (x ± y))"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag)
apply (case_tac "v x =   v y = ")
apply (erule disjE, simp,
       frule value_inf_zero[of v x], assumption+,
       simp add:aGroup.ag_l_zero amin_def,
       frule value_inf_zero[of v y], assumption+,
       simp add:aGroup.ag_r_zero amin_def, simp, erule conjE)
apply (cut_tac z = "v x" and w = "v y" in ale_linear,
       erule disjE, simp add:amin_le_plusTr,
       frule_tac amin_le_plusTr[of v y x], assumption+,
       simp add:aGroup.ag_pOp_commute amin_commute)
done

lemma (in Corps) value_less_eq:" valuation K v; x  carrier K; y  carrier K;
                       (v x) < (v y)  (v x) = (v (x ± y))"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule amin_le_plus[of v x y], assumption+,
       frule aless_imp_le[of "v x" "v y"],
       simp add: amin_def)
apply (frule amin_le_plus[of v "x ± y" "-a y"],
       rule aGroup.ag_pOp_closed, assumption+,
       rule aGroup.ag_mOp_closed, assumption+,
       simp add:val_minus_eq,
       frule aGroup.ag_mOp_closed[of "K" "y"], assumption+,
       simp add:aGroup.ag_pOp_assoc[of "K" "x" "y"],
       simp add:aGroup.ag_r_inv1, simp add:aGroup.ag_r_zero,
       simp add:amin_def)
 apply (case_tac "¬ (v (x ±K y)  (v y))", simp+)
done

lemma (in Corps) value_less_eq1:"valuation K v; x  carrier K; y  carrier K;
      (v x) < (v y)  v x =  v (y ± x)"
apply (cut_tac field_is_ring,
       frule Ring.ring_is_ag[of "K"],
       frule value_less_eq[of v x y], assumption+)
apply (subst aGroup.ag_pOp_commute, assumption+)
done

lemma (in Corps) val_1px:"valuation K v; x  carrier K; 0  (v (1r ± x))
          0  (v x)"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule Ring.ring_one[of "K"])
apply (rule contrapos_pp, simp+,
       case_tac "x = 𝟬K",
        simp add:aGroup.ag_r_zero, simp add:value_of_zero,
        simp add: aneg_le[of "0" "v x"],
        frule value_less_eq[of v x "1r"], assumption+,
        simp add:value_of_one)
apply (drule sym,
       simp add:aGroup.ag_pOp_commute[of "K" "x"])
done

lemma (in Corps) val_1mx:"valuation K v; x  carrier K;
                  0  (v (1r ± (-a x)))  0  (v x)"
by (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule val_1px[of v "-a x"],
       simp add:aGroup.ag_mOp_closed, assumption, simp add:val_minus_eq)

section "The normal valuation of v"

definition
  Lv :: "[('r, 'm) Ring_scheme , 'r  ant]  ant" (* Least nonnegative value *) where
  "Lv K v = AMin {x. x  v ` carrier K  0 < x}"

definition
  n_val :: "[('r, 'm) Ring_scheme, 'r  ant]  ('r  ant)" where
  "n_val K v = (λx carrier K.  (THE l. (l * (Lv K v)) = v x))"
                     (* normal valuation *)

definition
  Pg :: "[('r, 'm) Ring_scheme, 'r  ant]  'r" (* Positive generator *) where
  "Pg K v = (SOME x. x  carrier K - {𝟬K}  v x = Lv K v)"

lemma (in Corps) vals_pos_nonempty:"valuation K v 
                       {x. x  v ` carrier K  0 < x}  {}"
  using val_axiom5[of v] value_noninf_nonzero[of v] value_of_inv[THEN sym, of v]
  by (auto simp: ex_image_cong_iff) (metis Ring.ring_is_ag aGroup.ag_mOp_closed aGroup.ag_pOp_closed aGroup.ag_r_inv1 f_is_ring zero_lt_inf)

lemma (in Corps) vals_pos_LBset:"valuation K v 
            {x. x  v ` carrier K  0 < x}  LBset 1"
by (rule subsetI, simp add:LBset_def, erule conjE,
       rule_tac x = x in gt_a0_ge_1, assumption)

lemma (in Corps) Lv_pos:"valuation K v  0 < Lv K v"
apply (simp add:Lv_def,
       frule vals_pos_nonempty[of v],
       frule vals_pos_LBset[of v],
       simp only:ant_1[THEN sym],
       frule AMin[of "{x. x  v ` carrier K  0 < x}" "1"], assumption+,
       erule conjE)
apply simp
done

lemma (in Corps) AMin_z:"valuation K v 
         a. AMin {x. x  v ` carrier K  0 < x} = ant a"
apply (frule vals_pos_nonempty[of v],
       frule vals_pos_LBset[of v],
       simp only:ant_1[THEN sym],
       frule AMin[of "{x. x  v ` carrier K  0 < x}" "1"], assumption+,
       erule conjE)
apply (frule val_axiom5[of v],
       erule exE, (erule conjE)+,
       cut_tac x = "v x" in aless_linear[of _ "0"], simp,
       erule disjE,
       frule_tac x = x in value_noninf_nonzero[of v], assumption+,
       frule_tac x1 = x in value_of_inv[THEN sym, of v], assumption+)
apply (frule_tac x = "v x" in aless_minus[of _ "0"], simp,
       cut_tac x = x in invf_closed1, simp, erule conjE,
       frule valuation_map[of v],
       frule_tac a = "xK" in mem_in_image[of "v" "carrier K" "Z"], simp)
apply (drule_tac a = "v (xK)" in forall_spec, simp,
       frule_tac x = "xK" in val_nonzero_noninf[of v],
       thin_tac "v (xK)  v ` carrier K",
       thin_tac "{x  v ` carrier K. 0 < x}  LBset 1",
       thin_tac "AMin {x  v ` carrier K. 0 < x}  v ` carrier K",
       thin_tac "0 < AMin {x  v ` carrier K. 0 < x}", simp,
       thin_tac "v (xK)  v ` carrier K",
       thin_tac "{x  v ` carrier K. 0 < x}  LBset 1",
       thin_tac "AMin {x  v ` carrier K. 0 < x}  v ` carrier K",
       thin_tac "0 < AMin {x  v ` carrier K. 0 < x}", simp)
apply (rule noninf_mem_Z[of "AMin {x  v ` carrier K. 0 < x}"],
       frule image_sub[of v "carrier K" "Z" "carrier K"],
       rule subset_refl)
apply (rule subsetD[of "v ` carrier K" "Z"
                    "AMin {x  v ` carrier K. 0 < x}"], assumption+)
  apply auto
  by (metis (no_types, lifting) aneg_le aug_inf_noninf_is_z image_eqI value_in_aug_inf z_less_i)

lemma (in Corps) Lv_z:"valuation K v  z. Lv K v = ant z"
by (simp add:Lv_def, rule AMin_z, assumption+)

lemma (in Corps) AMin_k:"valuation K v 
         k carrier K - {𝟬}. AMin {x. x  v ` carrier K  0 < x} = v k"

apply (frule vals_pos_nonempty[of v],
       frule vals_pos_LBset[of v],
       simp only:ant_1[THEN sym],
       frule AMin[of "{x. x  v ` carrier K  0 < x}" "1"], assumption+,
       erule conjE)
apply (thin_tac "x{x. x  v ` carrier K  0 < x}.
                   AMin {x. x  v ` carrier K  0 < x}  x")
apply (simp add:image_def, erule conjE, erule bexE,
       thin_tac "{x. (xacarrier K. x = v xa)  0 < x}  LBset 1",
       thin_tac "x. (xacarrier K. x = v xa)  0 < x",
       subgoal_tac "x  carrier K - {𝟬}", blast,
       frule AMin_z[of v],  erule exE, simp)
apply (simp add:image_def,
       thin_tac "AMin {x. (xacarrier K. x = v xa)  0 < x} = ant a",
       rule contrapos_pp, simp+, frule sym, thin_tac "v (𝟬) = ant a",
       simp add:value_of_zero)
done

lemma (in Corps) val_Pg:" valuation K v 
                  Pg K v  carrier K - {𝟬}  v (Pg K v) = Lv K v"
apply (frule AMin_k[of v], unfold Lv_def, unfold Pg_def)
apply (rule someI2_ex)
 apply (erule bexE, drule sym, unfold Lv_def, blast)
 apply simp
done

lemma (in Corps) amin_generateTr:"valuation K v 
  wcarrier K - {𝟬}. z. v w = z *a AMin {x. x  v ` carrier K  0 < x}"
apply (frule vals_pos_nonempty[of v],
       frule vals_pos_LBset[of v],
       simp only:ant_1[THEN sym],
       frule AMin[of "{x. x  v ` carrier K  0 < x}" "1"], assumption+,
       frule AMin_z[of v], erule exE, simp,
       thin_tac "x. x  v ` carrier K  0 < x",
       (erule conjE)+, rule ballI, simp, erule conjE,
       frule_tac x = w in val_nonzero_noninf[of v], assumption+,
       frule_tac x = w in value_in_aug_inf[of v], assumption+,
       simp add:aug_inf_def,
       cut_tac a = "v w" in mem_ant, simp, erule exE,
       cut_tac a = z and b = a in amod_adiv_equality)
apply (case_tac "z mod a = 0", simp add:ant_0 aadd_0_r, blast,
       thin_tac "{x. x  v ` carrier K  0 < x}  LBset 1",
       thin_tac "v w  ", thin_tac "v w  - ")

apply (frule AMin_k[of v], erule bexE,
       drule sym,
       drule sym,
       drule sym,
       rotate_tac -1, drule sym)

apply (cut_tac z = z in z_in_aug_inf,
       cut_tac z = "(z div a)" and x = a in asp_z_Z,
       cut_tac z = "z mod a" in z_in_aug_inf,
       frule_tac a = "ant z" and b = "(z div a) *a ant a" and
       c = "ant (z mod a)" in ant_sol, assumption+,
       subst asprod_mult, simp, assumption, simp,
       frule_tac x = k and z = "z div a" in val_exp[of v],
        (erule conjE)+, assumption, simp, simp,
       thin_tac "(z div a) *a v k = v (kK(z div a))",
       erule conjE)
apply (frule_tac x = k and n = "z div a" in field_potent_nonzero1,
         assumption+,
      frule_tac a = k and n = "z div a" in npowf_mem, assumption,
      frule_tac x1 = "kK(z div a)" in value_of_inv[THEN sym, of v], assumption+,
      simp add:diff_ant_def,
       thin_tac "- v (kK(z div a)) = v ((kK(z div a))K)",
       cut_tac x = "kK(z div a)" in invf_closed1, simp,
       simp, erule conjE,
       frule_tac x1 = w and y1 = "(kK(z div a))K"  in
        val_t2p[THEN sym, of  v], assumption+, simp,
       cut_tac field_is_ring,
       thin_tac "v w + v ((kK(z div a))K) = ant (z mod a)",
       thin_tac "v (kK(z div a)) + ant (z mod a) = v w",
       frule_tac x = w and y = "(kK(z div a))K" in
                 Ring.ring_tOp_closed[of "K"], assumption+)
apply (frule valuation_map[of v],
       frule_tac a = "w r (kK(z div a))K" in mem_in_image[of "v"
        "carrier K" "Z"], assumption+, simp)
apply (thin_tac "AMin {x. x  v ` carrier K  0 < x} = v k",
       thin_tac "v  carrier K  Z",
       subgoal_tac "0 < v (w r (kK(z div a))K )",
       drule_tac a = "v (w r (kK(z div a))K)" in forall_spec,
       simp add:image_def)
apply (drule sym, simp)
apply (frule_tac b = a and a = z in pos_mod_conj, erule conjE,
       simp, simp,
       frule_tac b = a and a = z in pos_mod_conj, erule conjE, simp)
done

lemma (in Corps) val_principalTr1:" valuation K v  
            Lv K v  v ` (carrier K - {𝟬}) 
             (wv ` carrier K. a. w = a * Lv K v)  0 < Lv K v"
 apply (rule conjI,
        frule val_Pg[of v], erule conjE,
        simp add:image_def, frule sym, thin_tac "v (Pg K v) = Lv K v",
        erule conjE, blast)
 apply (rule conjI,
       rule ballI, simp add:image_def, erule bexE)

 apply  (
        frule_tac x = x in value_in_aug_inf[of v], assumption,
        frule sym, thin_tac "w = v x", simp add:aug_inf_def,
        cut_tac a = w in mem_ant, simp, erule disjE, erule exE,
        frule_tac x = x in value_noninf_nonzero[of v], assumption+,
        simp, frule amin_generateTr[of v])
 apply (drule_tac x = x in bspec, simp,
        erule exE,
        frule AMin_z[of v], erule exE, simp add:Lv_def,
        simp add:asprod_mult, frule sym, thin_tac "za * a = z",
        simp, subst a_z_z[THEN sym], blast)

 apply (simp add:Lv_def,
        frule AMin_z[of v], erule exE, simp,
        frule Lv_pos[of v], simp add:Lv_def,
        frule_tac m1 = a in a_i_pos[THEN sym], blast,
        simp add:Lv_pos)
done

lemma (in Corps) val_principalTr2:"valuation K v;
  c  v ` (carrier K - {𝟬})  (wv ` carrier K. a. w = a * c)  0 < c;
  d  v ` (carrier K - {𝟬})  (wv ` carrier K. a. w = a * d)  0 < d
        c = d"
apply ((erule conjE)+,
       drule_tac x = d in bspec,
       simp add:image_def, erule bexE, blast,
       drule_tac x = c in bspec,
       simp add:image_def, erule bexE, blast)

apply ((erule exE)+,
       drule sym, simp,
       simp add:image_def, (erule bexE)+, simp,
       (erule conjE)+,
       frule_tac x = x in val_nonzero_z[of v], assumption+, erule exE,
       frule_tac x = xa in val_nonzero_z[of v], assumption+, erule exE,
       simp) apply (
       subgoal_tac "a    a  -", subgoal_tac "aa    aa  -",
       cut_tac a = a in mem_ant, cut_tac a = aa in mem_ant, simp,
       (erule exE)+, simp add:a_z_z,
       thin_tac "c = ant z", frule sym, thin_tac "zb * z = za", simp)
apply (subgoal_tac "0 < zb",
       cut_tac a = zc and b = zb in mult.commute, simp,
       simp add:pos_zmult_eq_1_iff,
       rule contrapos_pp, simp+,
       cut_tac x = 0 and y = zb in less_linear, simp,
       thin_tac "¬ 0 < zb",
       erule disjE, simp,
       frule_tac i = 0 and j = z and k = zb in zmult_zless_mono_neg,
             assumption+, simp add:mult.commute)
apply (rule contrapos_pp, simp+, thin_tac "a    a  - ",
       erule disjE, simp, rotate_tac 5, drule sym,
       simp, simp, rotate_tac 5, drule sym, simp)
apply (rule contrapos_pp, simp+,
       erule disjE, simp, rotate_tac 4,
       drule sym, simp, simp,
       rotate_tac 4, drule sym,
       simp)
done

lemma (in Corps) val_principal:"valuation K v 
  ∃!x0. x0  v ` (carrier K - {𝟬}) 
     (w  v ` (carrier K). (a::ant). w = a * x0)  0 < x0"
by (rule ex_ex1I,
    frule val_principalTr1[of v], blast,
    rule_tac c = x0 and d = y in val_principalTr2[of v],
                 assumption+)

lemma (in Corps) n_val_defTr:"valuation K v; w  carrier K 
                           ∃!a. a * Lv K v = v w"
apply (rule ex_ex1I,
      frule AMin_k[of v],
      frule Lv_pos[of v], simp add:Lv_def,
      erule bexE,
      frule_tac x = k in val_nonzero_z[of v], simp, simp,
      erule exE, simp, (erule conjE)+)
apply (case_tac "w = 𝟬K", simp add:value_of_zero,
       frule_tac m = z in a_i_pos, blast)
apply (frule amin_generateTr[of v],
       drule_tac x = w in bspec, simp, simp)
apply (
       erule exE, simp add:asprod_mult,
       subst a_z_z[THEN sym], blast)
apply (frule AMin_k[of v]) apply (erule bexE,
      frule Lv_pos[of v], simp add:Lv_def) apply (
      erule conjE,
      frule_tac x = k in val_nonzero_z[of v], assumption+,
      erule exE, simp) apply (
      case_tac "w = 𝟬K", simp del:a_i_pos add:value_of_zero,
      subgoal_tac "y = ", simp, rule contrapos_pp, simp+,
      cut_tac a = a in mem_ant, simp,
      erule disjE, simp, erule exE, simp add:a_z_z)
apply (rule contrapos_pp, simp+,
      cut_tac a = y in mem_ant, simp, erule disjE, simp,
      erule exE, simp add:a_z_z,
      frule_tac x = w in val_nonzero_z[of v], assumption+,
      erule exE, simp, cut_tac a = a in mem_ant,
      erule disjE, simp, frule sym, thin_tac "-  = ant za", simp,
      erule disjE, erule exE, simp add:a_z_z)
apply (cut_tac a = y in mem_ant,
      erule disjE, simp, rotate_tac 3, drule sym,
      simp, erule disjE, erule exE, simp add:a_z_z, frule sym,
      thin_tac "zb * z = za", simp, simp,
      rotate_tac 3, drule sym,
      simp, simp, frule sym, thin_tac " = ant za", simp)
done

lemma (in Corps) n_valTr:" valuation K v; x  carrier K  
             (THE l. (l * (Lv K v)) = v x)*(Lv K v) = v x"
by (rule theI', rule n_val_defTr, assumption+)

lemma (in Corps) n_val:"valuation K v; x  carrier K  
                           (n_val K v x)*(Lv K v) = v x"
by (frule n_valTr[of v x], assumption+, simp add:n_val_def)

lemma (in Corps) val_pos_n_val_pos:"valuation K v; x  carrier K  
           (0  v x) = (0  n_val K v x)"
apply (frule n_val[of v x], assumption+,
       drule sym,
       frule Lv_pos[of v],
       frule Lv_z[of v], erule exE, simp)
apply (frule_tac w = z and x = 0 and y = "n_val K v x" in amult_pos_mono_r,
       simp add:amult_0_l)
done

lemma (in Corps) n_val_in_aug_inf:"valuation K v; x  carrier K 
                           n_val K v x  Z"
apply (cut_tac field_is_ring, frule Ring.ring_zero[of "K"],
       frule Lv_pos[of v],
       frule Lv_z[of v], erule exE,
       simp add:aug_inf_def)
apply (rule contrapos_pp, simp+)
apply (case_tac "x = 𝟬K", simp,
       frule n_val[of v "𝟬"],
       simp add:value_of_zero, simp add:value_of_zero)

apply (frule n_val[of v x], simp,
       frule val_nonzero_z[of v x], assumption+,
       erule exE, simp, rotate_tac -2, drule sym,
       simp)
done

lemma (in Corps) n_val_0:"valuation K v; x  carrier K; v x = 0
         n_val K v x = 0"
by (frule Lv_z[of v], erule exE,
       frule Lv_pos[of v],
       frule n_val[of v x], simp, simp,
       rule_tac z = z and a = "n_val K v x" in a_a_z_0, assumption+)

lemma (in Corps) value_n0_n_val_n0:"valuation K v; x  carrier K; v x  0 
                             n_val K v x  0"
apply (frule n_val[of v x],
       rule contrapos_pp, simp+, frule Lv_z[of v],
       erule exE, simp, simp only:ant_0[THEN sym])
apply (rule contrapos_pp, simp+,
       simp add:a_z_z)
done

lemma (in Corps) val_0_n_val_0:"valuation K v; x  carrier K 
                         (v x = 0) = (n_val K v x = 0)"
apply (rule iffI,
       simp add:n_val_0)
apply (rule contrapos_pp, simp+,
       frule value_n0_n_val_n0[of v x], assumption+)
apply simp
done

lemma (in Corps) val_noninf_n_val_noninf:"valuation K v; x  carrier K 
      (v x  ) = (n_val K v x  )"
by (frule Lv_z[of v], erule exE,
       frule Lv_pos[of v], simp,
       frule n_val[THEN sym, of v x],simp, simp,
       thin_tac "v x = n_val K v x * ant z",
       rule iffI, rule contrapos_pp, simp+,
       cut_tac mem_ant[of "n_val K v x"], erule disjE, simp,
       erule disjE, erule exE, simp add:a_z_z, simp, simp)

lemma (in Corps) val_inf_n_val_inf:"valuation K v; x  carrier K 
      (v x = ) = (n_val K v x = )"
by (cut_tac val_noninf_n_val_noninf[of v x], simp, assumption+)

lemma (in Corps) val_eq_n_val_eq:"valuation K v; x  carrier K; y  carrier K
    (v x = v y) = (n_val K v x = n_val K v y)"
apply (subst n_val[THEN sym, of v x], assumption+,
       subst n_val[THEN sym, of v y], assumption+,
       frule Lv_pos[of v], frule Lv_z[of v], erule exE, simp,
       frule_tac s = z in zless_neq[THEN not_sym, of "0"])
apply (rule iffI)
apply (rule_tac z = z in amult_eq_eq_r[of _ "n_val K v x" "n_val K v y"],
         assumption+)
apply simp
done

lemma (in Corps) val_poss_n_val_poss:"valuation K v; x  carrier K  
           (0 < v x) = (0 < n_val K v x)"
apply (simp add:less_le,
       frule val_pos_n_val_pos[of v x], assumption+,
       rule iffI, erule conjE, simp,
       simp add:value_n0_n_val_n0[of v x])
apply (drule sym,
       erule conjE, simp,
       frule_tac val_0_n_val_0[THEN sym, of v x], assumption+,
       simp)
done

lemma (in Corps) n_val_Pg:"valuation K v  n_val K v (Pg K v) = 1"
apply (frule val_Pg[of v], simp, (erule conjE)+,
       frule n_val[of v "Pg K v"], simp, frule Lv_z[of v], erule exE, simp,
       frule Lv_pos[of v], simp, frule_tac i = 0 and j = z in zless_neq)
apply (rotate_tac -1, frule not_sym, thin_tac "0  z",
       subgoal_tac "n_val K v (Pg K v) * ant z = 1 * ant z",
       rule_tac z = z in adiv_eq[of _ "n_val K v (Pg K v)" "1"], assumption+,
       simp add:amult_one_l)
done

lemma (in Corps) n_val_valuationTr1:"valuation K v 
                           xcarrier K. n_val K v x  Z"
by (rule ballI,
      frule n_val[of v], assumption,
      frule_tac x = x in value_in_aug_inf[of v], assumption,
      frule Lv_pos[of v], simp add:aug_inf_def,
      frule Lv_z[of v], erule exE, simp,
      rule contrapos_pp, simp+)

lemma (in Corps) n_val_t2p:"valuation K v; x  carrier K; y  carrier K 
                   n_val K v (x r y) = n_val K v x + (n_val K v y)"
apply (cut_tac field_is_ring,
       frule Ring.ring_tOp_closed[of K x y], assumption+,
       frule n_val[of v "x r y"], assumption+,
       frule Lv_pos[of "v"],
       simp add:val_t2p,
       frule n_val[THEN sym, of v x], assumption+,
       frule n_val[THEN sym, of v y], assumption+, simp,
       frule Lv_z[of v], erule exE, simp)
apply (subgoal_tac "ant z  0")
apply (frule_tac z1 = z in amult_distrib1[THEN sym, of _ "n_val K v x"
       "n_val K v y"], simp,
       thin_tac "n_val K v x * ant z + n_val K v y * ant z =
           (n_val K v x + n_val K v y) * ant z",
       rule_tac z = z and a = "n_val K v (x r y)" and
        b = "n_val K v x + n_val K v y" in adiv_eq, simp, assumption+, simp)
done

lemma (in Corps) n_val_valuationTr2:" valuation K v; x  carrier K;
      y  carrier K  
       amin (n_val K v x) (n_val K v y)  (n_val K v ( x ± y))"
apply (frule n_val[THEN sym, of v x], assumption+,
       frule n_val[THEN sym, of v y], assumption+,
       frule n_val[THEN sym, of v "x ± y"],
       cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       rule aGroup.ag_pOp_closed, assumption+)
apply (frule amin_le_plus[of v x y], assumption+, simp,
       simp add:amult_commute[of _ "Lv K v"],
       frule Lv_z[of v], erule exE, simp,
       frule Lv_pos[of v], simp,
       simp add:amin_amult_pos, simp add:amult_pos_mono_l)
done

lemma (in Corps) n_val_valuation:"valuation K v 
                                      valuation K (n_val K v)"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag)
apply (frule Lv_z[of v], erule exE, frule Lv_pos[of v], simp,
       subst valuation_def)
apply (rule conjI, simp add:n_val_def restrict_def extensional_def)
apply (rule conjI, simp add:n_val_valuationTr1)
apply (rule conjI, frule n_val[of v 𝟬],
       simp add:Ring.ring_zero,
       frule Lv_z[of v], erule exE, frule Lv_pos[of v],
       cut_tac mem_ant[of "n_val K v (𝟬)"], erule disjE,
       simp add:value_of_zero,
       erule disjE, erule exE, simp add:a_z_z value_of_zero, assumption+)
apply (rule conjI, rule ballI,
       frule_tac x = x in val_nonzero_noninf[of v], simp+,
       simp add:val_noninf_n_val_noninf)
apply (rule conjI, (rule ballI)+, simp add:n_val_t2p,
       rule conjI, rule ballI, rule impI,
       frule Lv_z[of v], erule exE,
            frule Lv_pos[of v], simp,
       frule_tac x = x in n_val[of v], simp,
       frule_tac w1 = z and x1 = 0 and y1 = "n_val K v x" in
            amult_pos_mono_r[THEN sym], simp add:amult_0_l,
       frule_tac x = x in val_axiom4[of v], assumption+,
       frule_tac x1 = "1r ± x" in n_val[THEN sym, of v],
       frule Ring.ring_is_ag[of "K"],
           rule aGroup.ag_pOp_closed, assumption+, simp add:Ring.ring_one,
           assumption,
       frule_tac w = z and x = 0 and y = "n_val K v (1r ± x)"
           in amult_pos_mono_r,
       simp add:amult_0_l)

apply (frule val_axiom5[of v], erule exE,
       (erule conjE)+,
       frule_tac x = x in value_n0_n_val_n0[of v], assumption+,
       frule_tac x = x in val_noninf_n_val_noninf, simp,
       blast)
done

lemma (in Corps) n_val_le_val:"valuation K v; x  carrier K; 0  (v x)  
                 (n_val K v x) (v x)"
by (subst n_val[THEN sym, of v x], assumption+,
       frule Lv_pos[of v],
       simp add:val_pos_n_val_pos[of v x],
       frule Lv_z[of v], erule exE,
       cut_tac b = z and x = "n_val K v x" in amult_pos, simp+,
       simp add:asprod_amult, simp add:amult_commute)

lemma (in Corps) n_val_surj:"valuation K v 
                                   x carrier K. n_val K v x = 1"
apply (frule Lv_z[of v], erule exE,
       frule Lv_pos[of v],
       frule AMin_k[of v], erule bexE, frule_tac x = k in n_val[of v], simp,
       simp add:Lv_def)
apply (subgoal_tac "n_val K v k * ant z = 1 * ant z",
       subgoal_tac "z  0",
       frule_tac z = z and a = "n_val K v k" and b = 1 in amult_eq_eq_r,
         assumption, blast, simp, simp add:amult_one_l)
done

lemma (in Corps) n_value_in_aug_inf:"valuation K v; x  carrier K 
                             n_val K v x  Z"
by (frule n_val[of v x], assumption,
    simp add:aug_inf_def, rule contrapos_pp, simp+,
    frule Lv_pos[of v], frule Lv_z[of v], erule exE, simp,
    frule value_in_aug_inf[of v x], assumption+, simp add:aug_inf_def)

lemma (in Corps) val_surj_n_valTr:"valuation K v; x  carrier K. v x = 1
        Lv K v = 1"
apply (erule bexE,
       frule_tac x = x in n_val[of v],
       simp, frule Lv_pos[of v])
apply (frule_tac w = "Lv K v" and x = "n_val K v x" in amult_1_both)
apply simp+
done

lemma (in Corps) val_surj_n_val:"valuation K v; x  carrier K. v x = 1 
                       (n_val K v) = v"
apply (rule funcset_eq[of _ "carrier K"],
      simp add:n_val_def restrict_def extensional_def,
      simp add:valuation_def)
apply (rule ballI,
       frule val_surj_n_valTr[of v], assumption+,
       frule_tac x = x in n_val[of v], assumption+,
       simp add:amult_one_r)
done

lemma (in Corps) n_val_n_val:"valuation K v 
        n_val K (n_val K v)  = n_val K v"
by (frule n_val_valuation[of v],
       frule n_val_surj[of v],
       simp add:val_surj_n_val)

lemma nnonzero_annonzero:"0 < N  an N  0"
apply (simp only:an_0[THEN sym])
apply (subst aneq_natneq, simp)
done


section "Valuation ring"

definition
  Vr :: "[('r, 'm) Ring_scheme, 'r  ant]  ('r, 'm) Ring_scheme" where
  "Vr K v = Sr K ({x. x  carrier K  0  (v x)})"

definition
  vp :: "[('r, 'm) Ring_scheme, 'r  ant]  'r set" where
  "vp K v = {x. x  carrier (Vr K v)  0 < (v x)}"

definition
  r_apow :: "[('r, 'm) Ring_scheme, 'r set, ant]  'r set" where
  "r_apow R I a = (if a =  then {𝟬R} else
                   (if a = 0 then carrier R else IR (na a)))"
                                          (** 0 ≤ a and a ≠ -∞ **)

abbreviation
  RAPOW  ("(3_ _ _)" [62,62,63]62) where
  "IR a == r_apow R I a"

lemma (in Ring) ring_pow_apow:"ideal R I 
                  IR n =  IR (an n)"
apply (simp add:r_apow_def)
apply (case_tac "n = 0", simp)
apply (simp add:nnonzero_annonzero)
apply (simp add:an_neq_inf na_an)
done

lemma (in Ring) r_apow_Suc:"ideal R I  IR (an (Suc 0)) = I"
apply (cut_tac an_1, simp add:r_apow_def)
apply (simp add:a0_neq_1[THEN not_sym])
  apply (simp only:ant_1[THEN sym])
  apply (simp del:ant_1 add:z_neq_inf[of 1, THEN not_sym])
  apply (simp add:na_1)
  apply (simp add:idealprod_whole_r)
done

lemma (in Ring) apow_ring_pow:"ideal R I 
                  IR n =  IR (an n)"
apply (simp add:r_apow_def)
apply (case_tac "n = 0", simp add:an_0)
apply (simp add: aless_nat_less[THEN sym],
       cut_tac an_neq_inf[of n],
       simp add: less_le[of 0 "an n"] na_an)
done

lemma (in Corps) Vr_ring:"valuation K v  Ring (Vr K v)"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       simp add:Vr_def, rule Ring.Sr_ring, assumption+)
  apply (simp add:sr_def)
  apply (intro conjI subsetI)
apply (simp_all add: value_of_one Ring.ring_one[of "K"])
apply ((rule allI, rule impI)+,
       (erule conjE)+, rule conjI, rule aGroup.ag_pOp_closed, assumption+,
       rule aGroup.ag_mOp_closed, assumption+)
apply (frule_tac x = x and y = "-a y" in amin_le_plus[of v], assumption+,
       rule aGroup.ag_mOp_closed, assumption+,
       simp add:val_minus_eq[of v]) apply (
       frule_tac z = 0 and x = "v x" and y = "v y" in amin_ge1, assumption+,
       frule_tac i = 0 and j = "amin (v x) (v y)" and k = "v (x ± -a y)" in
       ale_trans, assumption+, simp)
  by (simp add: Ring.ring_tOp_closed aadd_two_pos val_t2p)

lemma (in Corps) val_pos_mem_Vr:"valuation K v; x  carrier K 
                             (0  (v x)) = (x  carrier (Vr K v))"
by (rule iffI, (simp add:Vr_def Sr_def)+)

lemma (in Corps) val_poss_mem_Vr:"valuation K v; x  carrier K; 0 < (v x)
                          x  carrier (Vr K v)"
by (frule aless_imp_le[of "0" "v x"], simp add:val_pos_mem_Vr)

lemma (in Corps) Vr_one:"valuation K v  1rK  carrier (Vr K v)"
by (cut_tac field_is_ring, frule Ring.ring_one[of "K"],
       frule val_pos_mem_Vr[of v "1r"], assumption+,
       simp add:value_of_one)

lemma (in Corps) Vr_mem_f_mem:"valuation K v; x  carrier (Vr K v)
       x  carrier K"
by (simp add:Vr_def Sr_def)

lemma (in Corps) Vr_0_f_0:"valuation K v  𝟬Vr K v = 𝟬"
by (simp add:Vr_def Sr_def)

lemma (in Corps) Vr_1_f_1:"valuation K v  1r(Vr K v) = 1r"
by (simp add:Vr_def Sr_def)

lemma (in Corps) Vr_pOp_f_pOp:"valuation K v; x  carrier (Vr K v);
       y  carrier (Vr K v)   x ±Vr K v y = x ± y"
by (simp add:Vr_def Sr_def)

lemma (in Corps) Vr_mOp_f_mOp:"valuation K v; x  carrier (Vr K v)
                      -a(Vr K v) x = -a x"
by (simp add:Vr_def Sr_def)

lemma (in Corps) Vr_tOp_f_tOp:"valuation K v; x  carrier (Vr K v);
                     y  carrier(Vr K  v)   x r(Vr K v) y = x r y"
by (simp add:Vr_def Sr_def)

lemma (in Corps) Vr_pOp_le:"valuation K v; x  carrier K;
       y  carrier (Vr K v)   v x  (v x + (v y))"
apply (frule val_pos_mem_Vr[THEN sym, of v y],
       simp add:Vr_mem_f_mem, simp, frule aadd_pos_le[of "v y" "v x"],
       simp add:aadd_commute)
done

lemma (in Corps) Vr_integral:"valuation K v  Idomain (Vr K v)"
apply (simp add:Idomain_def,
       simp add:Vr_ring, simp add:Idomain_axioms_def,
       rule allI, rule impI, rule allI, (rule impI)+,
       simp add:Vr_tOp_f_tOp, simp add:Vr_0_f_0)
apply (rule contrapos_pp, simp+, erule conjE,
       cut_tac field_is_idom,
       frule_tac x = a in Vr_mem_f_mem[of v], assumption,
       frule_tac x = b in Vr_mem_f_mem[of v], assumption,
       frule_tac x = a and y = b in Idomain.idom_tOp_nonzeros[of "K"],
       assumption+, simp)
done

lemma (in Corps) Vr_exp_mem:"valuation K v; x  carrier (Vr K v)
        x^K n  carrier (Vr K v)"
by (frule Vr_ring[of v],
       induct_tac n, simp add:Vr_one,
       simp add:Vr_tOp_f_tOp[THEN sym, of v],
       simp add:Ring.ring_tOp_closed)

lemma (in Corps) Vr_exp_f_exp:"valuation K v; x  carrier (Vr K v) 
                                    x^(Vr K v) n =  x^K n"
apply (induct_tac n,
      simp, simp add:Vr_1_f_1, simp,
      thin_tac "x^(Vr K v) n = x^K n")
apply (rule Vr_tOp_f_tOp, assumption+,
      simp add:Vr_exp_mem, assumption)
done

lemma (in Corps) Vr_potent_nonzero:"valuation K v;
      x  carrier (Vr K v) - {𝟬Vr K v}   x^K n  𝟬Vr K v"
apply (frule Vr_mem_f_mem[of v x], simp,
       simp add:Vr_0_f_0, erule conjE)
apply (frule Vr_mem_f_mem[of v x], assumption+,
        simp add:field_potent_nonzero)
done

lemma (in Corps) elem_0_val_if:"valuation K v; x  carrier K; v x = 0
               x  carrier (Vr K v)  xK  carrier (Vr K v)"
apply (frule val_pos_mem_Vr[of v x], assumption, simp)
apply (frule value_zero_nonzero[of "v" "x"], simp add:Vr_mem_f_mem, simp)
apply (frule value_of_inv[of v x], assumption+,
       simp, subst val_pos_mem_Vr[THEN sym, of v "xK"], assumption+,
       cut_tac invf_closed[of x], simp+)
done

lemma (in Corps) elem0val:"valuation K v; x  carrier K; x  𝟬 
      (v x = 0) = ( x  carrier (Vr K v)  xK  carrier (Vr K v))"
apply (rule iffI, rule elem_0_val_if[of v], assumption+,
       erule conjE)
apply (simp add:val_pos_mem_Vr[THEN sym, of v x],
      frule Vr_mem_f_mem[of v "xK"], assumption+,
      simp add:val_pos_mem_Vr[THEN sym, of v "xK"],
      simp add:value_of_inv, frule ale_minus[of "0" "- v x"],
      simp add:a_minus_minus)
done

lemma (in Corps) ideal_inc_elem0val_whole:" valuation K v; x  carrier K;
 v x = 0; ideal (Vr K v) I; x  I   I = carrier (Vr K v)"
apply (frule elem_0_val_if[of v x], assumption+, erule conjE,
       frule value_zero_nonzero[of v x], assumption+,
       frule Vr_ring[of v],
       frule_tac I = I and x = x and r = "xK" in
       Ring.ideal_ring_multiple[of "Vr K v"], assumption+,
       cut_tac invf_closed1[of x], simp+, (erule conjE)+)
apply (simp add:Vr_tOp_f_tOp, cut_tac invf_inv[of x], simp+,
       simp add: Vr_1_f_1[THEN sym, of v],
       simp add:Ring.ideal_inc_one, simp+)
done

lemma (in Corps) vp_mem_Vr_mem:"valuation K v; x  (vp K v) 
                                                x  carrier (Vr K v)"
by (rule val_poss_mem_Vr[of v x], assumption+, (simp add:vp_def
       Vr_def Sr_def)+)

lemma (in Corps) vp_mem_val_poss:" valuation K v; x  carrier K 
                                   (x  vp K v) = (0 < (v x))"
by (simp add:vp_def, simp add:Vr_def Sr_def less_ant_def)

lemma (in Corps) Pg_in_Vr:"valuation K v   Pg K v  carrier (Vr K v)"
by (frule val_Pg[of v], erule conjE,
    frule Lv_pos[of v], drule sym,
    simp, erule conjE,
    simp add:val_poss_mem_Vr)

lemma (in Corps) vp_ideal:"valuation K v   ideal (Vr K v) (vp K v)"
apply (cut_tac field_is_ring,
       frule Vr_ring[of v],
       rule Ring.ideal_condition1, assumption+,
       rule subsetI, simp add:vp_mem_Vr_mem,
       simp add:vp_def)
apply (frule val_Pg[of v],
       frule Lv_pos[of v], simp, (erule conjE)+,
       drule sym, simp,
       frule val_poss_mem_Vr[of v "Pg K v"], assumption+, blast)

apply ((rule ballI)+,
       frule_tac x = x in vp_mem_Vr_mem[of v], assumption) apply (
       frule_tac x = y in vp_mem_Vr_mem[of v], assumption,
       simp add:vp_def,
       frule Ring.ring_is_ag[of "Vr K v"],
       frule_tac x = x and y = y in aGroup.ag_pOp_closed, assumption+, simp)
 apply (simp add:Vr_pOp_f_pOp,
        cut_tac x = "v x" and y = "v y" in amin_le_l,
        frule_tac x = x and y = y in amin_le_plus,
        (simp add:Vr_mem_f_mem)+,
       (frule_tac z = 0 and x = "v x" and y = "v y" in amin_gt, assumption+),
       rule_tac x = 0 and y = "amin (v x) (v y)" and z = "v (x ± y)" in
       less_le_trans, assumption+)
apply ((rule ballI)+,
       frule_tac x1 = r in val_pos_mem_Vr[THEN sym, of v],
       simp add:Vr_mem_f_mem, simp,
       frule_tac x = x in vp_mem_Vr_mem[of v], simp add:Vr_pOp_f_pOp,
       simp add:vp_def, simp add:Ring.ring_tOp_closed,
       simp add:Vr_tOp_f_tOp)
apply (frule_tac x = r in Vr_mem_f_mem[of v], assumption+,
       frule_tac x = x in Vr_mem_f_mem[of v], assumption+,
       simp add:val_t2p, simp add:aadd_pos_poss)
done

lemma (in Corps) vp_not_whole:"valuation K v 
                       (vp K v)  carrier (Vr K v)"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule Vr_ring[of v])
apply (rule contrapos_pp, simp+,
       drule sym,
       frule Ring.ring_one[of "Vr K v"], simp,
       simp add:Vr_1_f_1,
       frule Ring.ring_one[of "K"])
apply (simp only:vp_mem_val_poss[of v "1r"],
        simp add:value_of_one)
done

lemma (in Ring) elem_out_ideal_nonzero:"ideal R I; x  carrier R;
        x  I  x  𝟬R"
by (rule contrapos_pp, simp+, frule ideal_zero[of I],
       simp)

lemma (in Corps) vp_prime:"valuation K v  prime_ideal (Vr K v) (vp K v)"
apply (simp add:prime_ideal_def, simp add:vp_ideal)
apply (rule conjI)
(** if the unit is contained in (vp K v), then (vp K v) is
    the whole ideal, this contradicts vp_not_whole **)
apply (rule contrapos_pp, simp+,
       frule Vr_ring[of v],
       frule vp_ideal[of v],
       frule Ring.ideal_inc_one[of "Vr K v" "vp K v"], assumption+,
       simp add:vp_not_whole[of v]) (* done*)

(** if x ⋅(Vr K v) y is in (vp K v), then 0 < v (x ⋅K y). We have
    0 ≤ (v x) and 0 ≤ (v y), because x and y are elements of Vr K v.
    Since v (x ⋅K y) = (v x) + (v y), we have 0 < (v x) or 0 < (v y).
   To obtain the final conclusion, we suppose ¬ (x ∈ vp K v ∨ y ∈ vp K v)
   then, we have (v x) = 0 and (v y) = 0. Frome this, we have v (x ⋅K y) =
   0. Contradiction.  *)
apply ((rule ballI)+, rule impI, rule contrapos_pp, simp+, (erule conjE)+,
       frule Vr_ring[of v]) apply (
       frule_tac x = x in Vr_mem_f_mem[of v], assumption) apply (
       frule_tac x = y in Vr_mem_f_mem[of v], assumption) apply (
       frule vp_ideal[of v],
       frule_tac x = x in Ring.elem_out_ideal_nonzero[of "Vr K v" "vp K v"],
       assumption+) apply (
       frule_tac x = y in Ring.elem_out_ideal_nonzero[of "Vr K v" "vp K v"],
       assumption+, simp add:Vr_0_f_0,
       simp add:Vr_tOp_f_tOp) apply (
       frule_tac x = "x r y" in vp_mem_val_poss[of v],
       cut_tac field_is_ring, simp add:Ring.ring_tOp_closed, simp)
apply (cut_tac field_is_ring,
       frule_tac x = x and y = y in Ring.ring_tOp_closed, assumption+,
       simp add:Ring.ring_tOp_closed[of "Vr K v"],
       simp add:vp_def, simp add:aneg_less,
       frule_tac x1 = x in val_pos_mem_Vr[THEN sym, of v], assumption+,
       frule_tac x1 = y in val_pos_mem_Vr[THEN sym, of v], assumption+,
       frule_tac P = "x  carrier (Vr K v)" and Q = "0  v x" in eq_prop,
          assumption,
       frule_tac P = "y  carrier (Vr K v)" and Q = "0  v y" in eq_prop,
          assumption,
       frule_tac x = "v x" and y = 0 in ale_antisym, assumption+,
       frule_tac x = "v y" and y = 0 in ale_antisym, assumption+,
       simp add:val_t2p aadd_0_l)
done

lemma (in Corps) vp_pow_ideal:"valuation K v 
                      ideal (Vr K v) ((vp K v)(Vr K v) n)"
by (frule Vr_ring[of v], frule vp_ideal[of v],
       simp add:Ring.ideal_pow_ideal)

lemma (in Corps) vp_apow_ideal:"valuation K v; 0  n 
                      ideal (Vr K v) ((vp K v)(Vr K v) n)"
apply (frule Vr_ring[of v])
apply (case_tac "n = 0",
        simp add:r_apow_def, simp add:Ring.whole_ideal[of "Vr K v"])
apply (case_tac "n = ",
        simp add:r_apow_def, simp add:Ring.zero_ideal)
apply (simp add:r_apow_def, simp add:vp_pow_ideal)
done

lemma (in Corps) mem_vp_apow_mem_Vr:"valuation K v;
       0  N; x  vp K v (Vr K v) N   x  carrier (Vr K v)"
by (frule Vr_ring[of v], frule vp_apow_ideal[of v N], assumption,
    simp add:Ring.ideal_subset)

lemma (in Corps) elem_out_vp_unit:"valuation K v; x  carrier (Vr K v);
      x  vp K v   v x = 0"
by (metis Vr_mem_f_mem ale_antisym aneg_le val_pos_mem_Vr vp_mem_val_poss)

lemma (in Corps) vp_maximal:"valuation K v 
                          maximal_ideal (Vr K v) (vp K v)"
apply (frule Vr_ring[of v],
       simp add:maximal_ideal_def, simp add:vp_ideal)
(** we know that vp is not a whole ideal, and so vp does not include 1 **)
apply (frule vp_not_whole[of v],
       rule conjI, rule contrapos_pp, simp+, frule vp_ideal[of v],
       frule Ring.ideal_inc_one[of "Vr K v" "vp K v"], assumption+)
 apply simp
(** onemore condition of maximal ideal **)
apply (rule equalityI,
       rule subsetI, simp, erule conjE,
       case_tac "x = vp K v", simp, simp, rename_tac X)
(** show exists a unit contained in X **)
apply (frule_tac A = X in sets_not_eq[of _ "vp K v"], assumption+,
       erule bexE,
       frule_tac I = X and h = a in Ring.ideal_subset[of "Vr K v"],
       assumption+,
       frule_tac x = a in elem_out_vp_unit[of v], assumption+)
(** since v a = 0, we see a is a unit **)
 apply (frule_tac x = a and I = X in ideal_inc_elem0val_whole [of v],
        simp add:Vr_mem_f_mem, assumption+)

 apply (rule subsetI, simp, erule disjE,
       simp add:prime_ideal_def, simp add:vp_ideal,
       simp add:Ring.whole_ideal, rule subsetI, simp add:vp_mem_Vr_mem)
done

lemma (in Corps) ideal_sub_vp:" valuation K v; ideal (Vr K v) I;
 I  carrier (Vr K v)  I  (vp K v)"
apply (frule Vr_ring[of v], rule contrapos_pp, simp+)
 apply (simp add:subset_eq,
        erule bexE)
 apply (frule_tac h = x in Ring.ideal_subset[of "Vr K v" I], assumption+,
        frule_tac x = x in elem_out_vp_unit[of v], assumption+,
        frule_tac x = x in ideal_inc_elem0val_whole[of v _ I],
        simp add:Vr_mem_f_mem, assumption+, simp)
done

lemma (in Corps) Vr_local:"valuation K v; maximal_ideal (Vr K v) I 
                   (vp K v) = I"
apply (frule Vr_ring[of v],
       frule ideal_sub_vp[of v I], simp add:Ring.maximal_ideal_ideal)
apply (simp add:maximal_ideal_def,
       frule conjunct2, fold maximal_ideal_def, frule conjunct1,
       rule Ring.proper_ideal, assumption+,simp add:maximal_ideal_def, assumption)
apply (rule equalityI) prefer 2 apply assumption
 apply (rule contrapos_pp, simp+,
        frule sets_not_eq[of "vp K v" I], assumption+, erule bexE)
apply (frule_tac x = a in vp_mem_Vr_mem[of v],
 frule Ring.maximal_ideal_ideal[of "Vr K v" "I"], assumption,
 frule_tac x = a in Ring.elem_out_ideal_nonzero[of "Vr K v" "I"],
           assumption+,
 frule vp_ideal[of v], rule Ring.ideal_subset[of "Vr K v" "vp K v"],
 assumption+)

apply (frule_tac a = a in Ring.principal_ideal[of "Vr K v"], assumption+,
       frule Ring.maximal_ideal_ideal[of "Vr K v" I], assumption+,
       frule_tac ?I2.0 = "Vr K v p a"in Ring.sum_ideals[of "Vr K v" "I"],
        simp add:Ring.maximal_ideal_ideal, assumption,
   frule_tac ?I2.0 = "Vr K v p a"in Ring.sum_ideals_la1[of "Vr K v" "I"],
      assumption+,
   frule_tac ?I2.0 = "Vr K v p a"in Ring.sum_ideals_la2[of "Vr K v" "I"],
      assumption+,
   frule_tac a = a in Ring.a_in_principal[of "Vr K v"], assumption+,
   frule_tac A = "Vr K v p a" and B = "I (Vr K v) (Vr K v p a)"
       and c = a in subsetD, assumption+)
   thm Ring.sum_ideals_cont[of "Vr K v" "vp K v" I ]
apply (frule_tac B = "Vr K v p a" in Ring.sum_ideals_cont[of "Vr K v"
       "vp K v" I], simp add:vp_ideal, assumption)
 apply (frule_tac a = a in Ring.ideal_cont_Rxa[of "Vr K v" "vp K v"],
        simp add:vp_ideal, assumption+)
 apply (simp add:maximal_ideal_def, (erule conjE)+,
      subgoal_tac "I (Vr K v) (Vr K v p a)  {J. ideal (Vr K v) J  I  J}",
      simp, thin_tac "{J. ideal (Vr K v) J  I  J} = {I, carrier (Vr K v)}")
 apply (erule disjE, simp)
 apply (cut_tac A = "carrier (Vr K v)" and B = "I Vr K v Vr K v p a" and
        C = "vp K v" in subset_trans, simp, assumption,
        frule Ring.ideal_subset1[of "Vr K v" "vp K v"], simp add:vp_ideal,
        frule equalityI[of "vp K v" "carrier (Vr K v)"], assumption+,
        frule vp_not_whole[of v], simp)
 apply blast
done

lemma (in Corps) v_residue_field:"valuation K v 
                                Corps ((Vr K v)  /r (vp K v))"
by (frule Vr_ring[of v],
       rule Ring.residue_field_cd [of "Vr K v" "vp K v"], assumption+,
       simp add:vp_maximal)

lemma (in Corps) Vr_n_val_Vr:"valuation K v 
     carrier (Vr K v) = carrier (Vr K (n_val K v))"
by (simp add:Vr_def Sr_def,
       rule equalityI,
      (rule subsetI, simp, erule conjE, simp add:val_pos_n_val_pos),
      (rule subsetI, simp, erule conjE, simp add:val_pos_n_val_pos[THEN sym]))


section "Ideals in a valuation ring"

lemma (in Corps) Vr_has_poss_elem:"valuation K v 
                 xcarrier (Vr K v) - {𝟬Vr K v}. 0 < v x"
apply (frule val_Pg[of v], erule conjE,
       frule Lv_pos[of v], drule sym,
       subst Vr_0_f_0, assumption+)
apply (frule aeq_ale[of "Lv K v" "v (Pg K v)"],
       frule aless_le_trans[of "0" "Lv K v" "v (Pg K v)"], assumption+,
       frule val_poss_mem_Vr[of v "Pg K v"],
       simp, assumption, blast)
done

lemma (in Corps) vp_nonzero:"valuation K v   vp K v   {𝟬Vr K v}"
apply (frule Vr_has_poss_elem[of v], erule bexE,
       simp, erule conjE,
       frule_tac x1 = x in vp_mem_val_poss[THEN sym, of v],
       simp add:Vr_mem_f_mem, simp, rule contrapos_pp, simp+)
done

lemma (in Corps) field_frac_mul:"x  carrier K; y  carrier K; y  𝟬
           x = (x r  (yK)) r y"
apply (cut_tac invf_closed[of y],
       cut_tac field_is_ring,
       simp add:Ring.ring_tOp_assoc,
       subst linvf[of y], simp, simp add:Ring.ring_r_one[of K], simp)
done

lemma (in Corps) elems_le_val:"valuation K v; x  carrier K; y  carrier K;
       x  𝟬; v x  (v y)   rcarrier (Vr K v). y = r r x"
apply (frule ale_diff_pos[of "v x" "v y"], simp add:diff_ant_def,
       simp add:value_of_inv[THEN sym, of v x],
       cut_tac invf_closed[of "x"],
       simp only:val_t2p[THEN sym, of v y "xK"])
apply (cut_tac field_is_ring,
       frule_tac x = y and y = "xK" in Ring.ring_tOp_closed[of "K"],
       assumption+,
       simp add:val_pos_mem_Vr[of v "y r (xK)"],
       frule field_frac_mul[of y x], assumption+, blast)
apply simp
done

lemma (in Corps) val_Rxa_gt_a:"valuation K v; x  carrier (Vr K v) - {𝟬};
 y  carrier (Vr K v);  y  Rxa (Vr K v) x  v x  (v y)"
apply (simp add:Rxa_def,
       erule bexE,
       simp add:Vr_tOp_f_tOp, (erule conjE)+,
        frule_tac x = r in Vr_mem_f_mem[of v], assumption+,
        frule_tac x = x in Vr_mem_f_mem[of v], assumption+)
apply (subst val_t2p, assumption+,
       simp add:val_pos_mem_Vr[THEN sym, of v],
       frule_tac y = "v r" in aadd_le_mono[of "0" _ "v x"],
       simp add:aadd_0_l)
done

lemma (in Corps) val_Rxa_gt_a_1:"valuation K v; x  carrier (Vr K v);
y  carrier (Vr K v); x  𝟬; v x  (v y)  y  Rxa (Vr K v) x"
apply (frule_tac x = x in Vr_mem_f_mem[of v], assumption+,
       frule_tac x = y in Vr_mem_f_mem[of v], assumption+,
       frule v_ale_diff[of v x y], assumption+,
       cut_tac invf_closed[of x],
       cut_tac field_is_ring, frule Ring.ring_tOp_closed[of K y "xK"],
        assumption+)
apply (simp add:val_pos_mem_Vr[of "v" "y r (xK)"],
       frule field_frac_mul[of "y" "x"], assumption+,
       simp add:Rxa_def, simp add:Vr_tOp_f_tOp, blast, simp)
done

lemma (in Corps) eqval_inv:"valuation K v; x  carrier K; y  carrier K;
       y  𝟬; v x = v y   0 = v (x r (yK))"
by (cut_tac invf_closed[of y],
       simp add:val_t2p value_of_inv, simp add:aadd_minus_r,
       simp)

lemma (in Corps) eq_val_eq_idealTr:"valuation K v;
      x  carrier (Vr K v) - {𝟬}; y  carrier  (Vr K v); v x  (v y) 
                       Rxa (Vr K v) y   Rxa (Vr K v) x"
apply (frule val_Rxa_gt_a_1[of v x y], simp+,
       erule conjE)
apply (frule_tac x = x in Vr_mem_f_mem[of v], assumption+,
       frule Vr_ring[of v],
       frule Ring.principal_ideal[of "Vr K v" "x"], assumption,
       frule Ring.ideal_cont_Rxa[of "Vr K v" "(Vr K v) p x" "y"],
  assumption+)
done

lemma (in Corps) eq_val_eq_ideal:"valuation K v;
      x  carrier (Vr K v); y  carrier  (Vr K v); v x = v y
        Rxa (Vr K v) x = Rxa (Vr K v) y"
apply (case_tac "x = 𝟬K",
       simp add:value_of_zero,
       frule value_inf_zero[of v y],
       simp add:Vr_mem_f_mem, rule sym, assumption, simp)
apply (rule equalityI,
       rule eq_val_eq_idealTr[of v y x], assumption+,
       drule sym, simp,
       rule contrapos_pp, simp+, simp add:value_of_zero,
       frule Vr_mem_f_mem[of v x], assumption+,
       frule value_inf_zero[of v x], assumption+,
       rule sym, assumption, simp, simp, simp)
apply (rule eq_val_eq_idealTr[of v x y], assumption+, simp,
       assumption, rule aeq_ale, assumption+)
done

lemma (in Corps) eq_ideal_eq_val:"valuation K v; x  carrier (Vr K v);
y  carrier (Vr K v); Rxa (Vr K v) x = Rxa (Vr K v) y   v x = v y"
apply (case_tac "x = 𝟬K", simp,
       drule sym,
       frule Vr_ring[of v],
       frule Ring.a_in_principal[of "Vr K v" y], assumption+, simp,
       thin_tac "Vr K v p y = Vr K v p (𝟬)", simp add:Rxa_def,
       erule bexE, simp add:Vr_0_f_0[of v, THEN sym])
apply (simp add:Vr_tOp_f_tOp, simp add:Vr_0_f_0,
       frule_tac x = r in Vr_mem_f_mem[of v], assumption+,
       cut_tac field_is_ring, simp add:Ring.ring_times_x_0)
apply (frule Vr_ring[of v],
       frule val_Rxa_gt_a[of v x y], simp,
       simp)
apply (drule sym,
       frule Ring.a_in_principal[of "Vr K v" "y"], simp, simp)
apply (frule val_Rxa_gt_a[of v y x],
       simp, rule contrapos_pp, simp+,
       frule Ring.a_in_principal[of "Vr K v" "x"], assumption+,
       simp add:Rxa_def,
       erule bexE, simp add:Vr_tOp_f_tOp, cut_tac field_is_ring,
       frule_tac x = r in Vr_mem_f_mem[of v], assumption+,
       simp add:Ring.ring_times_x_0, simp,
       frule Ring.a_in_principal[of "Vr K v" "x"], assumption+, simp,
       rule ale_antisym, assumption+)
done

lemma (in Corps) zero_val_gen_whole:
 "valuation K v; x  carrier (Vr K v) 
             (v x = 0) = (Rxa (Vr K v) x = carrier (Vr K v))"
apply (frule Vr_mem_f_mem[of v x], assumption,
       frule Vr_ring[of v])
apply (rule iffI,
       frule Ring.principal_ideal[of "Vr K v" "x"], assumption+,
       frule Ring.a_in_principal[of "Vr K v" "x"], assumption+,
       rule ideal_inc_elem0val_whole[of v x "Vr K v p x"], assumption+,
       frule Ring.ring_one[of "Vr K v"],
       frule eq_set_inc[of "1r(Vr K v)"
              "carrier (Vr K v)" "Vr K v p x"], drule sym, assumption,
       thin_tac "1r(Vr K v)  carrier (Vr K v)",
       thin_tac "Vr K v p x = carrier (Vr K v)")
apply (simp add:Rxa_def, erule bexE,
       simp add:Vr_1_f_1, simp add:Vr_tOp_f_tOp,
       frule value_of_one[of v], simp,
       frule_tac x = r in Vr_mem_f_mem[of v], assumption+,
       cut_tac field_is_ring, simp add:val_t2p,
       simp add:val_pos_mem_Vr[THEN sym, of v],
       rule contrapos_pp, simp+,
       cut_tac less_le[THEN sym, of "0" "v x"], drule not_sym, simp,
       frule_tac x = "v r" and y = "v x" in aadd_pos_poss, assumption+,
       simp)
done

lemma (in Corps) elem_nonzeroval_gen_proper:" valuation K v;
      x  carrier (Vr K v); v x  0  Rxa (Vr K v) x  carrier (Vr K v)"
apply (rule contrapos_pp, simp+)
apply (simp add: zero_val_gen_whole[THEN sym])
done

text‹We prove that Vr K v is a principal ideal ring›

definition
  LI :: "[('r, 'm) Ring_scheme, 'r  ant, 'r set]  ant" where
         (** The least nonzero value of I **)
 "LI K v I = AMin (v ` I)"

definition
  Ig :: "[('r, 'm) Ring_scheme, 'r  ant, 'r set]  'r" where
                                          (** Generator of I **)
  "Ig K v I = (SOME x. x  I  v x = LI K v I)"

lemma (in Corps) val_in_image:"valuation K v; ideal (Vr K v) I; x  I 
                            v x  v ` I"
by (simp add:image_def, blast)

lemma (in Corps) I_vals_nonempty:"valuation K v; ideal (Vr K v) I 
                           v ` I  {}"
by (frule Vr_ring[of v],
    frule Ring.ideal_zero[of "Vr K v" "I"],
    assumption+, rule contrapos_pp, simp+)

lemma (in Corps) I_vals_LBset:" valuation K v; ideal (Vr K v) I 
                                          v ` I   LBset 0"
apply (frule Vr_ring[of v],
       rule subsetI, simp add:LBset_def, simp add:image_def)
apply (erule bexE,
       frule_tac h = xa in Ring.ideal_subset[of "Vr K v" "I"], assumption+)
apply (frule_tac x1 = xa in val_pos_mem_Vr[THEN sym, of v],
       simp add:Vr_mem_f_mem, simp)
done

lemma (in Corps) LI_pos:"valuation K v; ideal (Vr K v) I  0  LI K v I"
apply (simp add:LI_def,
       frule I_vals_LBset[of v],
       simp add:ant_0[THEN sym],
       frule I_vals_nonempty[of v], simp only:ant_0)

apply (simp only:ant_0[THEN sym], frule AMin[of "v ` I" "0"], assumption,
       erule conjE, frule subsetD[of "v ` I" "LBset (ant 0)" "AMin (v ` I)"],
       assumption+, simp add:LBset_def)
done

lemma (in Corps) LI_poss:"valuation K v; ideal (Vr K v) I;
                 I  carrier (Vr K v)  0 < LI K v I"
apply (subst less_le)
apply (simp add:LI_pos)
apply (rule contrapos_pp, simp+)

apply (simp add:LI_def,
       frule I_vals_LBset[of v], assumption+,
       simp add:ant_0[THEN sym],
       frule I_vals_nonempty[of v], assumption+, simp only:ant_0)

apply (simp only:ant_0[THEN sym], frule AMin[of "v ` I" "0"], assumption,
       erule conjE, frule subsetD[of "v ` I" "LBset (ant 0)" "AMin (v ` I)"],
       assumption+, simp add:LBset_def)

apply (thin_tac "xI. ant 0  v x",
       thin_tac "v ` I  {x. ant 0  x}", simp add:image_def,
       erule bexE, simp add:ant_0)
apply (frule Vr_ring[of v],
       frule_tac h = x in Ring.ideal_subset[of "Vr K v" "I"], assumption+,
       frule_tac x = x in zero_val_gen_whole[of v], assumption+,
       simp,
       frule_tac a = x in Ring.ideal_cont_Rxa[of "Vr K v" "I"], assumption+,
       simp, frule Ring.ideal_subset1[of "Vr K v" "I"], assumption+)
apply (frule equalityI[of "I" "carrier (Vr K v)"], assumption+, simp)
done

lemma (in Corps) LI_z:"valuation K v; ideal (Vr K v) I; I  {𝟬Vr K v} 
                 z. LI K v I = ant z"
apply (frule Vr_ring[of v],
       frule Ring.ideal_zero[of "Vr K v" "I"], assumption+,
       cut_tac mem_ant[of "LI K v I"],
       frule LI_pos[of v I], assumption,
       erule disjE, simp,
       cut_tac minf_le_any[of "0"],
       frule ale_antisym[of "0" "-"], assumption+, simp)
apply (erule disjE, simp,
       frule singleton_sub[of "𝟬Vr K v" "I"],
       frule sets_not_eq[of "I" "{𝟬Vr K v}"], assumption+,
       erule bexE, simp)

apply (simp add:LI_def,
       frule I_vals_LBset[of v], assumption+,
       simp only:ant_0[THEN sym],
       frule I_vals_nonempty[of v], assumption+,
       frule AMin[of "v ` I" "0"], assumption, erule conjE)
apply (frule_tac x = a in val_in_image[of v I], assumption+,
       drule_tac x = "v a" in bspec, simp,
       simp add:Vr_0_f_0,
       frule_tac x = a in val_nonzero_z[of v],
       simp add:Ring.ideal_subset Vr_mem_f_mem, assumption+,
       erule exE, simp,
       cut_tac x = "ant z" in inf_ge_any, frule_tac x = "ant z" in
       ale_antisym[of _ ""], assumption+, simp)
done

lemma (in Corps) LI_k:"valuation K v; ideal (Vr K v) I 
                                k I. LI K v I = v k"
by (simp add:LI_def,
       frule I_vals_LBset[of v], assumption+,
       simp only:ant_0[THEN sym],
       frule I_vals_nonempty[of v], assumption+,
       frule AMin[of "v ` I" "0"], assumption, erule conjE,
       thin_tac "xv ` I. AMin (v ` I)  x", simp add:image_def)

lemma (in Corps) LI_infinity:"valuation K v; ideal (Vr K v) I 
             (LI K v I = )  = (I = {𝟬Vr K v})"
apply (frule Vr_ring[of v])
apply (rule iffI)
apply (rule contrapos_pp, simp+,
       frule Ring.ideal_zero[of "Vr K v" "I"], assumption+,
       frule singleton_sub[of "𝟬Vr K v" "I"],
       frule sets_not_eq[of "I" "{𝟬Vr K v}"], assumption+,
       erule bexE,
       frule_tac h = a in Ring.ideal_subset[of "Vr K v" "I"], assumption+,
       simp add:Vr_0_f_0,
       frule_tac x = a in Vr_mem_f_mem[of v], assumption+,
       frule_tac x = a in val_nonzero_z[of v], assumption+,
       erule exE,
       simp add:LI_def,
       frule I_vals_LBset[of v], assumption+,
       simp only:ant_0[THEN sym],
       frule I_vals_nonempty[of v], assumption+,
       frule AMin[of "v ` I" "0"], assumption, erule conjE)
apply (frule_tac h = a in Ring.ideal_subset[of "Vr K v" "I"], assumption+,
       frule_tac x = a in val_in_image[of v I], assumption+,
       drule_tac x = "v a" in bspec, simp)
 apply (frule_tac x = a in val_nonzero_z[of v], assumption+,
       erule exE, simp,
       cut_tac x = "ant z" in inf_ge_any, frule_tac x = "ant z" in
       ale_antisym[of _ ""], assumption+, simp)

apply (frule sym, thin_tac "I = {𝟬Vr K v}",
       simp add:LI_def,
       frule I_vals_LBset[of v], assumption+,
       simp only:ant_0[THEN sym],
       frule I_vals_nonempty[of v], assumption+,
       frule AMin[of "v ` I" "0"], assumption, erule conjE,
       drule sym, simp,
       simp add:Vr_0_f_0 value_of_zero)
done

lemma (in Corps) val_Ig:"valuation K v; ideal (Vr K v) I 
                           (Ig K v I)  I  v (Ig K v I) = LI K v I"
by (simp add:Ig_def, rule someI2_ex,
    frule LI_k[of v I], assumption+, erule bexE,
    drule sym, blast, assumption)

lemma (in Corps) Ig_nonzero:"valuation K v; ideal (Vr K v) I; I  {𝟬Vr K v}
                   (Ig K v I)  𝟬"
by (rule contrapos_pp, simp+,
    frule LI_infinity[of v I], assumption+,
    frule val_Ig[of v I], assumption+, erule conjE,
    simp add:value_of_zero)

lemma (in Corps) Vr_ideal_npowf_closed:"valuation K v; ideal (Vr K v) I;
       x  I; 0 < n  xKn  I"
by (simp add:npowf_def, frule Vr_ring[of v],
      frule Ring.ideal_npow_closed[of "Vr K v" "I" "x" "nat n"], assumption+,
      simp, frule Ring.ideal_subset[of "Vr K v" "I" "x"], assumption+,
      simp add:Vr_exp_f_exp)

lemma (in Corps) Ig_generate_I:"valuation K v; ideal (Vr K v) I 
                        (Vr K v) p (Ig K v I) = I"
apply (frule Vr_ring[of v])
apply (case_tac "I = carrier (Vr K v)",
   frule sym, thin_tac "I = carrier (Vr K v)",
   frule Ring.ring_one[of "Vr K v"],
   simp, simp add: Vr_1_f_1,
   frule val_Ig[of v I], assumption+, erule conjE,
   frule LI_pos[of v I], assumption+,

   simp add: LI_def cong del: image_cong_simp,
   frule I_vals_LBset[of v], assumption+,
   simp only: ant_0[THEN sym],
   frule I_vals_nonempty[of v], assumption+,
   frule AMin[of "v ` I" "0"], assumption, erule conjE,

   frule val_in_image[of v I "1r"], assumption+,
   drule_tac x = "v (1r)" in bspec, assumption+,
   simp add: value_of_one ant_0 cong del: image_cong_simp,
   simp add: zero_val_gen_whole[of v "Ig K v I"])

apply (frule val_Ig[of v I], assumption+, (erule conjE)+,
       frule Ring.ideal_cont_Rxa[of "Vr K v" "I" "Ig K v I"], assumption+,
       rule equalityI, assumption+)

apply (case_tac "LI K v I = ",
       frule LI_infinity[of v I], simp,
       simp add:Rxa_def, simp add:Ring.ring_times_x_0,
       frule Ring.ring_zero, blast)

apply (rule subsetI,
       case_tac "v x = 0",
       frule_tac x = x in Vr_mem_f_mem[of v],
       simp add:Ring.ideal_subset,
       frule_tac x = x in zero_val_gen_whole[of v],
       simp add:Ring.ideal_subset, simp,
       frule_tac a = x in Ring.ideal_cont_Rxa[of "Vr K v" "I"], assumption+,
       simp, frule Ring.ideal_subset1[of "Vr K v" "I"], assumption,
       frule equalityI[of "I" "carrier (Vr K v)"], assumption+, simp)
apply (simp add:LI_def,
       frule I_vals_LBset[of v], assumption+,
       simp only:ant_0[THEN sym],
       frule I_vals_nonempty[of v], assumption+,
       frule AMin[of "v ` I" "0"], assumption, erule conjE,
       frule_tac x = "v x" in bspec,
       frule_tac x = x in val_in_image[of v I], assumption+,
       simp)
apply (drule_tac x =  x in bspec, assumption,
       frule_tac y = x in eq_val_eq_idealTr[of v "Ig K v I"],
           simp add:Ring.ideal_subset,
       rule contrapos_pp, simp+, simp add:value_of_zero,
       simp add:Ring.ideal_subset, simp)

apply (frule_tac a = x in Ring.a_in_principal[of "Vr K v"],
       simp add:Ring.ideal_subset, rule subsetD, assumption+)
done

lemma (in Corps) Pg_gen_vp:"valuation K v  
                          (Vr K v) p (Pg K v) = vp K v"
apply (frule vp_ideal[of v],
       frule Ig_generate_I[of v "vp K v"], assumption+,
       frule vp_not_whole[of v],
       frule eq_val_eq_ideal[of v "Ig K v (vp K v)" "Pg K v"],
       frule val_Ig [of v "vp K v"], assumption+, erule conjE,
       simp add:vp_mem_Vr_mem)

apply (frule val_Pg[of v], erule conjE,
       frule Lv_pos[of v],
       rotate_tac -2, drule sym, simp,
       simp add:val_poss_mem_Vr)

apply (thin_tac "Vr K v p Ig K v (vp K v) = vp K v",
       frule val_Pg[of v], erule conjE,
       simp, frule val_Ig[of v "vp K v"], assumption+, erule conjE,
       simp, thin_tac "v (Pg K v) = Lv K v",
       thin_tac "Ig K v (vp K v)  vp K v  v (Ig K v (vp K v)) =
        LI K v (vp K v)", simp add:LI_def Lv_def,
       subgoal_tac "v ` vp K v = {x. x  v ` carrier K  0 < x}",
       simp)

apply (thin_tac "ideal (Vr K v) (vp K v)", thin_tac "Pg K v  carrier K",
       thin_tac "Pg K v  𝟬",
       rule equalityI, rule subsetI,
       simp add:image_def vp_def, erule exE, erule conjE,
       (erule conjE)+,
       frule_tac x = xa in Vr_mem_f_mem[of v], assumption+, simp, blast)

apply (rule subsetI, simp add:image_def vp_def, erule conjE, erule bexE, simp,
       frule_tac x = xa in val_poss_mem_Vr[of v], assumption+,
       cut_tac y = "v xa" in less_le[of "0"], simp, blast, simp)
done

lemma (in Corps) vp_gen_t:"valuation K v  
                tcarrier (Vr K v). vp K v = (Vr K v) p t"
by (frule Pg_gen_vp[of v], frule Pg_in_Vr[of v], blast)

lemma (in Corps) vp_gen_nonzero:"valuation K v; vp K v = (Vr K v) p t 
                 t  𝟬Vr K v"
apply (rule contrapos_pp, simp+,
       cut_tac Ring.Rxa_zero[of "Vr K v"], drule sym, simp,
       simp add:vp_nonzero)
apply (simp add:Vr_ring)
done

lemma (in Corps) n_value_idealTr:"valuation K v; 0  n 
        (vp K v) (Vr K v) n = Vr K v p ((Pg K v)^(Vr K v) n)"
apply (frule Vr_ring[of v],
       frule Pg_gen_vp[THEN sym, of v],
       simp add:vp_ideal,
       frule val_Pg[of v], simp, (erule conjE)+)
apply (subst Ring.principal_ideal_n_pow[of "Vr K v" "Pg K v"
       "Vr K v p Pg K v"], assumption+,
       frule Lv_pos[of v], rotate_tac -2, frule sym,
       thin_tac "v (Pg K v) = Lv K v", simp, simp add:val_poss_mem_Vr,
       simp+)
done

lemma (in Corps) ideal_pow_vp:"valuation K v; ideal (Vr K v) I;
                     I  carrier (Vr K v); I  {𝟬Vr K v}  
                     I = (vp K v)(Vr K v) (na (n_val K v (Ig K v I)))"
apply (frule Vr_ring[of v],
       frule Ig_generate_I[of v I], assumption+)

apply (frule n_val[of v "Ig K v I"],
       frule val_Ig[of v I], assumption+, erule conjE,
       simp add:Ring.ideal_subset[of "Vr K v" "I" "Ig K v I"] Vr_mem_f_mem)

apply (frule val_Pg[of v], erule conjE,
       rotate_tac -1, drule sym, simp,
       frule Ig_nonzero[of v I], assumption+,
       frule LI_pos[of v I], assumption+,
       frule Lv_pos[of v],
       frule val_Ig[of v I], assumption+, (erule conjE)+,
       rotate_tac -1, drule sym, simp,
       frule val_pos_n_val_pos[of v "Ig K v I"],
       simp add:Ring.ideal_subset Vr_mem_f_mem,
       simp)
apply (frule zero_val_gen_whole[THEN sym, of v "Ig K v I"],
       simp add:Ring.ideal_subset,
       simp, rotate_tac -1, drule not_sym,
       cut_tac less_le[THEN sym, of "0" "v (Ig K v I)"], simp,
              thin_tac "0  v (Ig K v I)",
       frule Ring.ideal_subset[of "Vr K v" I "Ig K v I"], assumption+,
       frule Vr_mem_f_mem[of v "Ig K v I"], assumption+,
       frule val_poss_n_val_poss[of v "Ig K v I"], assumption+, simp)
apply (frule Ig_nonzero[of v I],
       frule val_nonzero_noninf[of v "Ig K v I"], assumption+,
       simp add:val_noninf_n_val_noninf[of v "Ig K v I"],
       frule val_poss_mem_Vr[of v "Pg K v"], assumption+,
       subst n_value_idealTr[of v "na (n_val K v (Ig K v I))"],
          assumption+, simp add:na_def)

apply (frule eq_val_eq_ideal[of v "Ig K v I"
               "(Pg K v)^(Vr K v) (na (n_val K v (Ig K v I)))"], assumption+,
       rule Ring.npClose, assumption+,
       simp add:Vr_exp_f_exp[of v "Pg K v"],
       subst val_exp_ring[THEN sym, of v "Pg K v"
                          "na (n_val K v (Ig K v I))"], assumption+)
apply (frule Lv_z[of v], erule exE, simp,
      rotate_tac 6, drule sym, simp,
      subst asprod_amult,
      simp add:val_poss_n_val_poss[of v "Ig K v I"],
      frule val_nonzero_noninf[of v "Ig K v I"], assumption+,
      frule val_noninf_n_val_noninf[of v "Ig K v I"], assumption+, simp,
      rule aposs_na_poss[of "n_val K v (Ig K v I)"], assumption+)
apply (fold an_def)
apply (subst an_na[THEN sym, of "n_val K v (Ig K v I)"],
      frule val_nonzero_noninf[of v "Ig K v I"], assumption+,
      frule val_noninf_n_val_noninf[of v "Ig K v I"], assumption+, simp,
      simp add:aless_imp_le, simp)
apply simp
done

lemma (in Corps) ideal_apow_vp:"valuation K v; ideal (Vr K v) I 
                     I = (vp K v) (Vr K v) (n_val K v (Ig K v I))"
apply (frule Vr_ring[of v])
apply (case_tac "v (Ig K v I) = ",
       frule val_Ig[of v I], assumption,
       frule val_inf_n_val_inf[of v "Ig K v I"],
       simp add:Ring.ideal_subset Vr_mem_f_mem, simp, simp add:r_apow_def,
       simp add:LI_infinity[of v I])

apply (case_tac "v (Ig K v I) = 0",
       frule val_0_n_val_0[of v "Ig K v I"],
       frule val_Ig[of v I], assumption+, erule conjE,
       simp add:Ring.ideal_subset Vr_mem_f_mem, simp,

       frule val_Ig[of v I], assumption,
       frule zero_val_gen_whole[of v "Ig K v I"],
       simp add:Ring.ideal_subset, (erule conjE)+, simp,
       frule Ring.ideal_cont_Rxa[of "Vr K v" "I" "Ig K v I"], assumption+)
apply (simp,
       frule Ring.ideal_subset1[of "Vr K v" "I"], assumption+,
       frule equalityI[of "I" "carrier (Vr K v)"], assumption+,
       simp add:r_apow_def)
apply (frule val_noninf_n_val_noninf[of v "Ig K v I"],
       frule val_Ig[of v I], assumption,
       simp add:Ring.ideal_subset Vr_mem_f_mem, simp,
       frule value_n0_n_val_n0[of v "Ig K v I"],
       frule val_Ig[of v I], assumption,
       simp add:Ring.ideal_subset Vr_mem_f_mem, assumption)

apply (simp add:r_apow_def,
       rule ideal_pow_vp, assumption+,
       frule elem_nonzeroval_gen_proper[of v "Ig K v I"],
       frule val_Ig[of v I], assumption+, erule conjE,
       simp add:Ring.ideal_subset, assumption, simp add:Ig_generate_I)

apply (frule val_Ig[of v I], assumption+, erule conjE, simp,
       simp add:LI_infinity[of v I])
done

(* A note to the above lemma (in Corps).
  Let K be a field and v be a valuation. Let R be the valuaiton ring of v,
and let P be the maximal ideal of R. If I is an ideal of R such that I ≠ 0
and I ≠ R, then I = P^n. Here n = nat znt n_valuation K G a i v (I_gen
K v I)) which is nat of the integer part of the normal value of
(I_gen K v I).  Let b be a generator of I, then n = v (b) / v (p), where
p is a generator of P in R:
                           I = P ♢R n

Here
          P = vp K v,
          R = Vr K v,
          b = Ig K v I,,
          n = nat n_val K v (Ig K v I).
It is easy to see that n = v* b. Here v* is the normal valuation derived from
v. *)

lemma (in Corps) ideal_apow_n_val:"valuation K v; x  carrier (Vr K v) 
                        (Vr K v) p x = (vp K v)(Vr K v) (n_val K v x)"
apply (frule Vr_ring[of v],
       frule Ring.principal_ideal[of "Vr K v" "x"], assumption+,
       frule ideal_apow_vp[of v "Vr K v p x"], assumption+)
apply (frule val_Ig[of v "Vr K v p x"], assumption+, erule conjE,
       frule Ring.ideal_subset[of "Vr K v" "Vr K v p x"
             "Ig K v (Vr K v p x)"], assumption+,
       frule Ig_generate_I[of v "Vr K v p x"], assumption+)
apply (frule eq_ideal_eq_val[of v "Ig K v (Vr K v p x)" x],
       assumption+,
       thin_tac "Vr K v p Ig K v (Vr K v p x) = Vr K v p x",
       thin_tac "v (Ig K v (Vr K v p x)) = LI K v (Vr K v p x)",
       frule n_val[THEN sym, of v x],
       simp add:Vr_mem_f_mem, simp,
       thin_tac "v x = n_val K v x * Lv K v",
       frule n_val[THEN sym, of v "Ig K v (Vr K v p x)"],
       simp add:Vr_mem_f_mem, simp,
       thin_tac "v (Ig K v (Vr K v p x)) = n_val K v x * Lv K v")
apply (frule Lv_pos[of v],
       frule Lv_z[of v], erule exE, simp,
       frule_tac s = z in zless_neq[THEN not_sym, of "0"],
       frule_tac z = z in adiv_eq[of _ "n_val K v (Ig K v (Vr K v p x))"
        "n_val K v x"], assumption+, simp)
done

lemma (in Corps) t_gen_vp:"valuation K v; t  carrier K; v t = 1 
                        (Vr K v) p t = vp K v"
(*
apply (frule val_surj_n_val[of v], blast)
apply (frule ideal_apow_n_val[of v t])
apply (cut_tac a0_less_1)
apply (rule val_poss_mem_Vr[of v t], assumption+, simp)
apply (simp add:r_apow_def)
apply (simp only:ant_1[THEN sym], simp only:ant_0[THEN sym])
apply (simp only:aeq_zeq, simp)
apply (cut_tac z_neq_inf[THEN not_sym, of "1"], simp)
apply (simp only:an_1[THEN sym]) apply (simp add:na_an)
apply (rule Ring.idealprod_whole_r[of "Vr K v" "vp K v"])
apply (simp add:Vr_ring)
apply (simp add:vp_ideal)
done *)

proof -
assume  a1:"valuation K v" and
        a2:"t  carrier K" and
        a3:"v t = 1"
 from a1 and a2 and a3 have h1:"t  carrier (Vr K v)"
          apply (cut_tac a0_less_1)
          apply (rule val_poss_mem_Vr[of v t], assumption+, simp) done
 from a1 and a2 and a3 have h2:"n_val K v = v"
          apply (subst val_surj_n_val[of v]) apply assumption
          apply blast  apply simp done
 from a1 and h1 have h3:"Vr K v p t = vp K v (Vr K v) (n_val K v t)"
          apply (simp add:ideal_apow_n_val[of v t]) done
 from a1 and a3 and h2 and h3 show ?thesis
        apply (simp add:r_apow_def)
        apply (simp only:ant_1[THEN sym], simp only:ant_0[THEN sym])
        apply (simp only:aeq_zeq, simp)
        apply (cut_tac z_neq_inf[THEN not_sym, of "1"], simp)
        apply (simp only:an_1[THEN sym]) apply (simp add:na_an)
        apply (rule Ring.idealprod_whole_r[of "Vr K v" "vp K v"])
        apply (simp add:Vr_ring)
        apply (simp add:vp_ideal) done
qed

lemma (in Corps) t_vp_apow:"valuation K v; t  carrier K; v t = 1 
                        (Vr K v) p (t^(Vr K v) n) = (vp K v)(Vr K v) (an n)"
(*
apply (frule Vr_ring[of v],
       subst Ring.principal_ideal_n_pow[THEN sym, of "Vr K v" t "vp K v" n],
       assumption+)
apply (cut_tac a0_less_1, rule val_poss_mem_Vr[of v], assumption+)
apply (simp, simp add:t_gen_vp,
       simp add:r_apow_def)
 apply (rule conjI, rule impI,
        simp only:an_0[THEN sym], frule an_inj[of n 0], simp)
apply (rule impI)
 apply (rule conjI, rule impI)
 apply (simp add:an_def)
apply (rule impI, cut_tac an_nat_pos[of n], simp add:na_an)
done *)

proof -
assume  a1:"valuation K v" and
        a2:"t  carrier K" and
        a3:"v t = 1"
from a1 have h1:"Ring (Vr K v)"  by (simp add:Vr_ring[of v])
from a1 and a2 and a3 have h2:"t  carrier (Vr K v)"
        apply (cut_tac a0_less_1)
        apply (rule val_poss_mem_Vr) apply assumption+ apply simp done
from a1 and a2 and a3 and h1 and h2 show ?thesis
 apply (subst Ring.principal_ideal_n_pow[THEN sym, of "Vr K v" t "vp K v" n])
 apply assumption+
 apply (simp add:t_gen_vp)
 apply (simp add:r_apow_def)
 apply (rule conjI, rule impI,
        simp only:an_0[THEN sym], frule an_inj[of n 0], simp)
 apply (rule impI)
 apply (rule conjI, rule impI)
 apply (simp add:an_def)
 apply (rule impI, cut_tac an_nat_pos[of n], simp add:na_an)
done
qed

lemma (in Corps) nonzeroelem_gen_nonzero:"valuation K v; x  𝟬;
                 x  carrier (Vr K v)   Vr K v p x  {𝟬Vr K v}"
by (frule Vr_ring[of v],
    frule_tac a = x in Ring.a_in_principal[of "Vr K v"], assumption+,
    rule contrapos_pp, simp+, simp add:Vr_0_f_0)

subsection "Amin lemma (in Corps)s "

lemma (in Corps)  Amin_le_addTr:"valuation K v 
(j  n. f j  carrier K)  Amin n (v  f)  (v (nsum K f n))"
apply (induct_tac n)
 apply (rule impI, simp)

apply (rule impI,
       simp,
       frule_tac x = "Σe K f n" and y = "f (Suc n)" in amin_le_plus[of v],
       cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       cut_tac n = n in aGroup.nsum_mem[of K _ f], assumption,
       rule allI, simp add:funcset_mem, assumption, simp)
 apply (frule_tac z = "Amin n (λu. v (f u))" and z' = "v (Σe K f n)" and
        w = "v (f (Suc n))" in amin_aminTr,
        rule_tac i = "amin (Amin n (λu. v (f u))) (v (f (Suc n)))" and
        j = "amin (v (Σe K f n)) (v (f (Suc n)))" and
        k = "v (Σe K f n ± (f (Suc n)))" in ale_trans, assumption+)
done

lemma (in Corps) Amin_le_add:"valuation K v; j  n. f j  carrier K 
                      Amin n (v  f)  (v (nsum K f n))"
by (frule Amin_le_addTr[of v n f], simp)

lemma (in Corps) value_ge_add:"valuation K v; j  n. f j  carrier K;
                     j  n. z  ((v  f) j)   z  (v (Σe K f n))"
apply (frule Amin_le_add[of v n f], assumption+,
       cut_tac Amin_ge[of n "v  f" z],
       rule ale_trans, assumption+)
apply (rule allI, rule impI,
       simp add:comp_def Zset_def,
       rule value_in_aug_inf[of v], assumption+, simp+)
done

lemma (in Corps) Vr_ideal_powTr1:"valuation K v; ideal (Vr K v) I;
 I  carrier (Vr K v); b  I   b  (vp K v)"
by (frule ideal_sub_vp[of v I], assumption+, simp add:subsetD)

section ‹pow of vp and n_value› -- convergence --›

lemma (in Corps) n_value_x_1:"valuation K v; 0  n;
                    x  (vp K v) (Vr K v) n   n  (n_val K v x)"
(* 1. prove that x ∈ carrier (Vr K v) and that x ∈ carrier K *)
apply ((case_tac "n = ", simp add:r_apow_def,
        simp add:Vr_0_f_0, cut_tac field_is_ring,
        frule Ring.ring_zero[of "K"], frule val_inf_n_val_inf[of v 𝟬],
        assumption+, simp add:value_of_zero),
       (case_tac "n = 0", simp add:r_apow_def,
        subst val_pos_n_val_pos[THEN sym, of v x], assumption+,
        simp add:Vr_mem_f_mem,
        subst val_pos_mem_Vr[of v x], assumption+,
        simp add:Vr_mem_f_mem, assumption,
        simp add:r_apow_def, frule Vr_ring[of v],
        frule vp_pow_ideal[of v "na n"],
        frule Ring.ideal_subset[of "Vr K v" "(vp K v) (Vr K v) (na n)" x],
        assumption+, frule Vr_mem_f_mem[of v x], assumption+))
(* 1. done *)

(** 2. Show that
  v (I_gen K v (vpr K  v)^Vr K v⇧ nat n) ≤ v x.  the key lemma (in Corps)  is
 "val_Rxa_gt_a"                  **)

apply (case_tac "x = 𝟬K", simp,
      frule value_of_zero[of v],
      simp add:val_inf_n_val_inf,
      simp add:n_value_idealTr[of v "na n"],

      frule val_Pg[of v], erule conjE, simp, erule conjE,
      frule Lv_pos[of v],
      rotate_tac -4, frule sym, thin_tac "v (Pg K v) = Lv K v", simp,
      frule val_poss_mem_Vr[of v "Pg K v"], assumption+,
      frule val_Rxa_gt_a[of v "Pg K v^(Vr K v) (na n)" x],

      frule Vr_integral[of v],
      simp only:Vr_0_f_0[of v, THEN sym],
      frule Idomain.idom_potent_nonzero[of "Vr K v" "Pg K v" "na n"],
      assumption+, simp, simp add:Ring.npClose, assumption+)

apply (thin_tac "x  Vr K v p (Pg K v^(Vr K v) (na n))",
       thin_tac "ideal (Vr K v) (Vr K v p (Pg K v^(Vr K v) (na n)))")

apply (simp add:Vr_exp_f_exp[of v "Pg K v"],
       simp add:val_exp_ring[THEN sym, of v "Pg K v"],
       simp add:n_val[THEN sym, of v x],
       frule val_nonzero_z[of v "Pg K v"], assumption+,
         erule exE, simp,
       frule aposs_na_poss[of "n"], simp add: less_le,
       simp add:asprod_amult,

       frule_tac w = z in amult_pos_mono_r[of _ "ant (int (na n))"
                   "n_val K v x"], simp,
       cut_tac an_na[of "n"], simp add:an_def, assumption+)
done

lemma (in Corps) n_value_x_1_nat:"valuation K v; x  (vp K v)(Vr K v) n  
             (an n)  (n_val K v x)"
apply (cut_tac an_nat_pos[of "n"])
apply( frule n_value_x_1[of  "v" "an n" "x"], assumption+)
apply (simp add:r_apow_def)
apply (case_tac "n = 0", simp, simp)
apply (cut_tac aless_nat_less[THEN sym, of "0" "n"])
apply simp
unfolding less_le
apply simp
apply (cut_tac an_neq_inf [of "n"])
apply simp
apply (simp add: na_an)
apply assumption
done

lemma (in Corps) n_value_x_2:"valuation K v; x  carrier (Vr K v);
        n  (n_val K v x);  0  n   x  (vp K v) (Vr K v) n"
apply (frule Vr_ring[of v],
       frule val_Pg[of v], erule conjE,
       simp, erule conjE, drule sym,
       frule Lv_pos[of v], simp,
       frule val_poss_mem_Vr[of v "Pg K v"], assumption+)

apply (case_tac "n = ",
       simp add:r_apow_def, cut_tac inf_ge_any[of "n_val K v x"],
       frule ale_antisym[of "n_val K v x" ""], assumption+,
       frule val_inf_n_val_inf[THEN sym, of v "x"],
       simp add:Vr_mem_f_mem, simp,
       frule value_inf_zero[of v x],
       simp add:Vr_mem_f_mem, simp+, simp add:Vr_0_f_0)

apply (case_tac "n = 0",
       simp add:r_apow_def,
       simp add:r_apow_def,
       subst n_value_idealTr[of v "na n"], assumption+,
       simp add:apos_na_pos)
apply (rule val_Rxa_gt_a_1[of v "Pg K v^(Vr K v) (na n)" x],
            assumption+,
       rule Ring.npClose, assumption+,
       simp add:Vr_0_f_0[THEN sym, of v],
       frule Vr_integral[of v],
       frule val_poss_mem_Vr[of v "Pg K v"], assumption+,
       simp add:Idomain.idom_potent_nonzero)

apply (simp add:Vr_exp_f_exp,
      simp add:val_exp_ring[THEN sym, of v],
      rotate_tac -5, drule sym,
      frule Lv_z[of v], erule exE, simp,
      frule aposs_na_poss[of "n"], simp add: less_le,
      simp add:asprod_amult, subst n_val[THEN sym, of v x],
      assumption+,
      simp add:Vr_mem_f_mem, simp,
      subst amult_pos_mono_r[of _ "ant (int (na n))" "n_val K v x"],
         assumption,
      cut_tac an_na[of "n"], simp add:an_def, assumption+)
done



lemma (in Corps) n_value_x_2_nat:"valuation K v; x  carrier (Vr K v);
      (an n)  ((n_val K v) x)   x  (vp K v)(Vr K  v)  n"
by (frule n_value_x_2[of v x "an n"], assumption+,
       simp, simp add:r_apow_def,
       case_tac "an n = ", simp add:an_def, simp,
       case_tac "n = 0", simp,
       subgoal_tac "an n  0", simp, simp add:na_an,
       rule contrapos_pp, simp+, simp add:an_def)

lemma (in Corps) n_val_n_pow:"valuation K v; x  carrier (Vr K v); 0  n 
         (n  (n_val K v x)) = (x  (vp K v) (Vr K v)  n)"
by (rule iffI, simp add:n_value_x_2, simp add:n_value_x_1)

lemma (in Corps) eqval_in_vpr_apow:"valuation K v; x  carrier K; 0  n;
      y  carrier K; n_val K v x = n_val K v y; x  (vp K v)(Vr K v) n 
      y  (vp K v) (Vr K v) n"
apply (frule n_value_x_1[of v n x], assumption+, simp,
       rule n_value_x_2[of v y n], assumption+,
       frule mem_vp_apow_mem_Vr[of v n x], assumption+)
apply (frule val_pos_mem_Vr[THEN sym, of v x], assumption+, simp,
       simp add:val_pos_n_val_pos[of v x],
       simp add:val_pos_n_val_pos[THEN sym, of v y],
       simp add:val_pos_mem_Vr, assumption+)
done

lemma (in Corps) convergenceTr:"valuation K v; x  carrier K; b  carrier K;
  b  (vp K v)(Vr K v) n; (Abs (n_val K v x))  n 
                x r b  (vp K v)(Vr K v) (n + (n_val K v x))"
(** Valuation ring is a ring **)
apply (cut_tac Abs_pos[of "n_val K v x"],
       frule ale_trans[of "0" "Abs (n_val K v x)" "n"], assumption+,
       thin_tac "0  Abs (n_val K v x)")
apply (frule Vr_ring[of v],
       frule_tac aadd_le_mono[of "Abs (n_val K v x)" "n" "n_val K v x"],
       cut_tac Abs_x_plus_x_pos[of "n_val K v x"],
       frule ale_trans[of "0" "Abs (n_val K v x) + n_val K v x"
        "n + n_val K v x"], assumption+,
       thin_tac "0  Abs (n_val K v x) + n_val K v x",
       thin_tac "Abs (n_val K v x) + n_val K v x  n + n_val K v x",
       rule n_value_x_2[of v "x r b" "n + n_val K v x"], assumption+)
apply (frule n_value_x_1[of v n b], assumption+)
 apply (frule aadd_le_mono[of "n" "n_val K v b" "n_val K v x"],
       frule ale_trans[of "0" "n + n_val K v x" "n_val K v b + n_val K v x"],
       assumption)
 apply (thin_tac "0  n + n_val K v x",
        thin_tac "n  n_val K v b",
        thin_tac "n + n_val K v x  n_val K v b + n_val K v x",
       simp add:aadd_commute[of "n_val K v b" "n_val K v x"])
apply (frule n_val_valuation[of v],
       simp add:val_t2p[THEN sym, of "n_val K v" x b],
       cut_tac field_is_ring,
       frule Ring.ring_tOp_closed[of "K" "x" "b"], assumption+,
       simp add:val_pos_n_val_pos[THEN sym, of v "x r b"],
       simp add:val_pos_mem_Vr,
       frule n_val_valuation[of v],
       subst val_t2p[of "n_val K v"], assumption+,
       frule n_value_x_1[of v n b], assumption+,
       simp add:aadd_commute[of "n_val K v x" "n_val K v b"],
       rule aadd_le_mono[of n "n_val K v b" "n_val K v x"], assumption+)
done

lemma (in Corps) convergenceTr1:"valuation K v; x  carrier K;
      b  (vp K v)(Vr K v) (n + Abs (n_val K v x)); 0  n 
                                 x r b  (vp K v) (Vr K v) n"
apply (cut_tac field_is_ring,
       frule Vr_ring[of v],
       frule vp_apow_ideal[of v "n + Abs (n_val K v x)"],
       cut_tac Abs_pos[of "n_val K v x"],
       rule aadd_two_pos[of "n" "Abs (n_val K v x)"], assumption+)

apply (frule Ring.ideal_subset[of "Vr K v" "vp K v (Vr K v) (n + Abs (n_val K v x))"
        "b"], assumption+,
       frule Vr_mem_f_mem[of v b], assumption,
       frule convergenceTr[of v x b "n +  Abs (n_val K v x)"], assumption+,
       rule aadd_pos_le[of "n" "Abs (n_val K v x)"], assumption)

apply (frule  apos_in_aug_inf[of "n"],
       cut_tac Abs_pos[of "n_val K v x"],
       frule apos_in_aug_inf[of "Abs (n_val K v x)"],
       frule n_value_in_aug_inf[of v x], assumption+,
       frule aadd_assoc_i[of "n" "Abs (n_val K v x)" "n_val K v x"],
              assumption+,
       cut_tac Abs_x_plus_x_pos[of "n_val K v x"])

apply (frule_tac Ring.ring_tOp_closed[of K x b], assumption+,
       rule n_value_x_2[of v "x r b" n], assumption+)

apply (subst val_pos_mem_Vr[THEN sym, of v "x r b"], assumption+,
       subst val_pos_n_val_pos[of v "x r b"], assumption+)

apply (frule n_value_x_1[of "v" "n + Abs(n_val K v x) + n_val K v x" "x r b"],
       subst aadd_assoc_i, assumption+,
       rule aadd_two_pos[of "n"], assumption+,
       rule ale_trans[of "0" "n + Abs (n_val K v x) + n_val K v x"
                "n_val K v (x r b)"],
       simp, simp add:aadd_two_pos, assumption,
       frule n_value_x_1[of "v" "n + Abs (n_val K v x)" " b"],
       cut_tac Abs_pos[of "n_val K v x"],
       rule aadd_two_pos[of "n" "Abs (n_val K v x)"], assumption+)

apply (frule n_val_valuation[of v],
        subst val_t2p[of  "n_val K v"], assumption+)
apply (frule aadd_le_mono[of "n + Abs (n_val K v x)" "n_val K v b"
                              "n_val K v x"],
        simp add:aadd_commute[of "n_val K v b" "n_val K v x"],
        rule ale_trans[of "n" "n + (Abs (n_val K v x) + n_val K v x)"
           "n_val K v x + n_val K v b"],
        frule aadd_pos_le[of "Abs (n_val K v x) + n_val K v x" "n"],
        simp add:aadd_commute[of "n"], assumption+)
done

lemma (in Corps) vp_potent_zero:"valuation K v; 0  n 
             (n = ) = (vp K v (Vr K v) n = {𝟬Vr K v})"
apply (rule iffI)
apply (simp add:r_apow_def, rule contrapos_pp, simp+,
       frule apos_neq_minf[of "n"],
       cut_tac mem_ant[of "n"], simp, erule exE, simp,
       simp add:ant_0[THEN sym], thin_tac "n = ant z")

apply (case_tac "z = 0", simp add:ant_0, simp add:r_apow_def,
       frule Vr_ring[of v],
       frule Ring.ring_one[of "Vr K v"], simp,
       simp add:Vr_0_f_0, simp add:Vr_1_f_1,
       frule value_of_one[of v], simp, simp add:value_of_zero,
       cut_tac n = z in zneq_aneq[of _ "0"], simp only:ant_0)
apply (simp add:r_apow_def,
       frule_tac n = "na (ant z)" in n_value_idealTr[of v],
       simp add:na_def,
       simp, thin_tac "vp K v (Vr K v) (na (ant z)) = {𝟬Vr K v}",
       frule Vr_ring[of v],
       frule  Pg_in_Vr[of v],
       frule_tac n = "na (ant z)" in Ring.npClose[of "Vr K v" "Pg K v"],
       assumption)
apply (frule_tac a = "(Pg K v)^(Vr K v) (na (ant z))" in
                   Ring.a_in_principal[of "Vr K v"], assumption,
       simp, frule Vr_integral[of "v"],
       frule val_Pg[of v], simp, (erule conjE)+,
       frule_tac n = "na (ant z)" in Idomain.idom_potent_nonzero[of "Vr K v"
        "Pg K v"], assumption+,
       simp add:Vr_0_f_0, simp)
done

lemma (in Corps) Vr_potent_eqTr1:"valuation K v; 0  n; 0  m;
        (vp K v) (Vr K v) n = (vp K v) (Vr K v) m; m = 0    n = m"
(*** compare the value of the generator of each ideal ***)
(** express each ideal as a principal ideal **)
apply (frule Vr_ring[of v],
       simp add:r_apow_def,
       case_tac "n = 0", simp,
       case_tac "n = ", simp,
       frule val_Pg[of v], erule conjE, simp,
       erule conjE,
       rotate_tac -3, drule sym,
       frule Lv_pos[of v], simp,
       frule val_poss_mem_Vr[of v "Pg K v"], assumption+,
       drule sym, simp, simp add:Vr_0_f_0)

apply (simp,
       drule sym,
       frule Ring.ring_one[of "Vr K v"], simp,

       frule n_value_x_1_nat[of v "1r(Vr K v)" "na n"], assumption,
       simp add:an_na, simp add:Vr_1_f_1,
       frule n_val_valuation[of v],
       simp add:value_of_one[of "n_val K v"])
done

lemma (in Corps) Vr_potent_eqTr2:"valuation K v;
        (vp K v) (Vr K v) n = (vp K v) (Vr K v) m     n = m"

(** 1. express each ideal as a principal ideal **)
apply (frule Vr_ring[of v],
       frule val_Pg[of v], simp, (erule conjE)+,
       rotate_tac -1, frule sym, thin_tac "v (Pg K v) = Lv K v",
       frule Lv_pos[of v], simp)

apply (subgoal_tac "0  int n", subgoal_tac "0  int m",
       frule n_value_idealTr[of "v" "m"]) apply simp apply simp
 apply(
       thin_tac "vp K v (Vr K v) m = Vr K v p (Pg K v^(Vr K v) m)",
       frule n_value_idealTr[of "v" "n"], simp, simp,
       thin_tac "vp K v (Vr K v) n = Vr K v p (Pg K v^(Vr K v) m)",
       frule val_poss_mem_Vr[of  "v" "Pg K v"], assumption+)

(** 2. the value of generators should coincide **)
 apply (frule Lv_z[of v], erule exE,
        rotate_tac -4, drule sym, simp,
        frule eq_ideal_eq_val[of "v" "Pg K v^(Vr K v) n" "Pg K v^(Vr K v) m"])
 apply (rule Ring.npClose, assumption+, rule Ring.npClose, assumption+)
 apply (simp only:Vr_exp_f_exp,
        simp add:val_exp_ring[THEN sym, of v "Pg K v"],
        thin_tac "Vr K v p (Pg K v^K n) = Vr K v p (Pg K v^K m)")

apply (case_tac "n = 0", simp, case_tac "m = 0", simp,
       simp only:of_nat_0_less_iff[THEN sym, of "m"],
       simp only:asprod_amult a_z_z,
       simp only:ant_0[THEN sym], simp only:aeq_zeq, simp)
apply (auto simp add: asprod_mult)
done

lemma (in Corps) Vr_potent_eq:"valuation K v; 0  n; 0  m;
              (vp K v) (Vr K v) n = (vp K v) (Vr K v) m   n = m"
apply (frule n_val_valuation[of v],
       case_tac "m = 0",
       simp add:Vr_potent_eqTr1)
apply (case_tac "n = 0",
       frule sym, thin_tac "vp K v (Vr K v) n = vp K v (Vr K v) m",
       frule Vr_potent_eqTr1[of v m n], assumption+,
       rule sym, assumption,
       frule vp_potent_zero[of  "v" "n"], assumption+)
apply (case_tac "n = ", simp,
       thin_tac "vp K v (Vr K v)  = {𝟬Vr K v}",
       frule vp_potent_zero[THEN sym, of v m], assumption+, simp,
       simp,
       frule vp_potent_zero[THEN sym, of v "m"], assumption+, simp,
       thin_tac "vp K v (Vr K v) m  {𝟬Vr K v}")

apply (frule aposs_na_poss[of "n"], subst less_le, simp,
       frule aposs_na_poss[of "m"], subst less_le, simp,
       simp add:r_apow_def,
       frule Vr_potent_eqTr2[of  "v" "na n" "na m"], assumption+,
       thin_tac "vp K v (Vr K v) (na n) = vp K v (Vr K v) (na m)",
       simp add:aeq_nat_eq[THEN sym])
done

text‹the following two lemma (in Corps) s are used in completion of K›

lemma (in Corps) Vr_prime_maximalTr1:"valuation K v; x  carrier (Vr K v);
       Suc 0 < n   x r(Vr K v) (x^K (n - Suc 0))  (Vr K v) p (x^K n)"
apply (frule Vr_ring[of v],
       subgoal_tac "x^K n = x^K (Suc (n - Suc 0))",
       simp del:Suc_pred,
       rotate_tac -1, drule sym)
apply (subst Vr_tOp_f_tOp, assumption+,
       subst Vr_exp_f_exp[of v, THEN sym], assumption+,
       simp only:Ring.npClose, simp del:Suc_pred)
 apply (cut_tac field_is_ring,
       frule Ring.npClose[of K x "n - Suc 0"],
       frule Vr_mem_f_mem[of v x], assumption+,
       frule Vr_mem_f_mem[of v x], assumption+)
       apply (simp add:Ring.ring_tOp_commute[of K x "x^K (n - Suc 0)"])
 apply (rule Ring.a_in_principal, assumption)
 apply (frule Ring.npClose[of "Vr K v" x n], assumption,
        simp add:Vr_exp_f_exp)
 apply (simp only:Suc_pred)
done

lemma (in Corps) Vr_prime_maximalTr2:" valuation K v; x  vp K v; x  𝟬;
  Suc 0 < n  x  Vr K v p (x^K n)  x^K (n - Suc 0)  (Vr K v) p (x^K n)"
apply (frule Vr_ring[of v])
apply (frule vp_mem_Vr_mem[of v x], assumption,
       frule Ring.npClose[of "Vr K v" x n],
       simp only:Vr_exp_f_exp)
apply (cut_tac field_is_ring,
       cut_tac field_is_idom,
       frule Vr_mem_f_mem[of v x], assumption+,
       frule Idomain.idom_potent_nonzero[of K x n], assumption+)
apply (rule conjI)
 apply (rule contrapos_pp, simp+)
 apply (frule val_Rxa_gt_a[of v "x^K n" x],
        simp, simp add:Vr_exp_f_exp, assumption+)
 apply (simp add:val_exp_ring[THEN sym, of v x n])
 apply (frule val_nonzero_z[of v x], assumption+, erule exE,
        simp add:asprod_amult a_z_z)
 apply (simp add:vp_mem_val_poss[of v x])
apply (rule contrapos_pp, simp+)
apply (frule val_Rxa_gt_a[of v "x^K n" "x^K (n - Suc 0)"])
   apply (simp, frule Ring.npClose[of "Vr K v" "x" "n - Suc 0"], assumption+)
   apply (simp add:Vr_exp_f_exp)
  apply (frule Ring.npClose[of "Vr K v" "x" "n - Suc 0"], assumption+,
        simp add:Vr_exp_f_exp, assumption)
apply (simp add:val_exp_ring[THEN sym, of v x])
apply (simp add:vp_mem_val_poss[of "v" "x"])
apply (frule val_nonzero_z[of  "v" "x"], assumption+, erule exE,
        simp add:asprod_amult a_z_z)
done

lemma (in Corps) Vring_prime_maximal:"valuation K v; prime_ideal (Vr K v) I;
      I  {𝟬Vr K v}  maximal_ideal (Vr K v) I"
apply (frule Vr_ring[of v],
       frule Ring.prime_ideal_proper[of "Vr K v" "I"], assumption+,
       frule Ring.prime_ideal_ideal[of "Vr K v" "I"], assumption+,
       frule ideal_pow_vp[of v I],
       frule n_value_idealTr[of "v" "na (n_val K v (Ig K v I))"],
                  simp, simp, assumption+)

apply (case_tac "na (n_val K v (Ig K v I)) = 0",
       simp, frule Ring.Rxa_one[of "Vr K v"], simp,
       frule Suc_leI[of "0" "na (n_val K v (Ig K v I))"],
       thin_tac "0 < na (n_val K v (Ig K v I))")
apply (case_tac "na (n_val K v (Ig K v I)) = Suc 0", simp,
       frule Pg_in_Vr[of v])
apply (frule vp_maximal[of v],
       frule Ring.maximal_ideal_ideal[of "Vr K v" "vp K v"], assumption+,
       subst Ring.idealprod_whole_r[of "Vr K v" "vp K v"], assumption+)

apply (rotate_tac -1, drule not_sym,
       frule le_neq_implies_less[of "Suc 0" "na (n_val K v (Ig K v I))"],
       assumption+,
       thin_tac "Suc 0  na (n_val K v (Ig K v I))",
       thin_tac "Suc 0  na (n_val K v (Ig K v I))",
       thin_tac "Vr K v p 1rVr K v = carrier (Vr K v)")
apply (frule val_Pg[of v], simp, (erule conjE)+,
       frule Lv_pos[of v], rotate_tac -2, drule sym)
 apply (frule val_poss_mem_Vr[of "v" "Pg K v"],
        frule vp_mem_val_poss[THEN sym, of "v" "Pg K v"], assumption+, simp)

apply (frule Vr_prime_maximalTr2[of v "Pg K v"
                            "na (n_val K v (Ig K v I))"],
       simp add:vp_mem_val_poss[of v "Pg K v"], assumption+, erule conjE)
apply (frule Ring.npMulDistr[of "Vr K v" "Pg K v" "na 1" "na (n_val K v (Ig K v I)) - Suc 0"], assumption+, simp add:na_1)

apply (rotate_tac 8, drule sym)
apply (frule Ring.a_in_principal[of "Vr K v"
         "Pg K v^(Vr K v) (na (n_val K v (Ig K v I)))"], simp add:Ring.npClose)

apply (simp add:Vr_exp_f_exp[of "v"])
    apply (simp add:Ring.ring_l_one[of "Vr K v"])
    apply (frule n_value_idealTr[THEN sym,
                       of v "na (n_val K v (Ig K v I))"], simp)
    apply (simp add:Vr_exp_f_exp)
    apply (rotate_tac 6, drule sym, simp)
apply (thin_tac "I  carrier (Vr K v)",
   thin_tac "I = vp K v (Vr K v) (na (n_val K v (Ig K v I)))",
   thin_tac "v (Pg K v) = Lv K v",
 thin_tac "(Vr K v) p ((Pg K v) r(Vr K v)
                   ((Pg K v)^K (na ((n_val K v) (Ig K v I)) - (Suc 0)))) =
    I",
   thin_tac "Pg K v  carrier K",
   thin_tac "Pg K v  𝟬",
   thin_tac "Pg K v^K (na ((n_val K v) (Ig K v I))) =
     Pg K v rVr K v Pg K v^K ((na ((n_val K v) (Ig K v I))) - Suc 0)")


apply (simp add:prime_ideal_def, erule conjE,
      drule_tac x = "Pg K v" in bspec, assumption,
      drule_tac x = "Pg K v^K (na (n_val K v (Ig K v I)) - Suc 0) " in bspec)
      apply (simp add:Vr_exp_f_exp[THEN sym, of v])
apply (rule Ring.npClose[of "Vr K v" "Pg K v"], assumption+)
apply simp
done

text‹From the above lemma (in Corps) , we see that a valuation ring is of dimension one.›

lemma (in Corps) field_frac1:"1r  𝟬; x  carrier K  x = x r ((1r)K)"
by (simp add:invf_one,
       cut_tac field_is_ring,
       simp add:Ring.ring_r_one[THEN sym])

lemma (in Corps) field_frac2:"x  carrier K; x  𝟬  x = (1r) r ((xK)K)"
by (cut_tac field_is_ring, simp add:field_inv_inv,
       simp add:Ring.ring_l_one[THEN sym])

lemma (in Corps) val_nonpos_inv_pos:"valuation K v; x  carrier K;
        ¬ 0  (v x)   0 < (v (xK))"
by (case_tac "x = 𝟬K", simp add:value_of_zero,
       frule Vr_ring[of v],
       simp add:aneg_le[of "0" "v x"],
       frule value_of_inv[THEN sym, of v x], assumption+,
       frule aless_minus[of "v x" "0"], simp)

lemma (in Corps) frac_Vr_is_K:"valuation K v; x  carrier K 
 scarrier (Vr K v). tcarrier (Vr K v) - {𝟬}. x = s r (tK)"
apply (frule Vr_ring[of v],
       frule has_val_one_neq_zero[of v])
apply (case_tac "x = 𝟬K",
       frule Ring.ring_one[of "Vr K v"],
       frule field_frac1[of x],
       simp only:Vr_1_f_1, frule Ring.ring_zero[of "Vr K v"],
       simp add:Vr_0_f_0 Vr_1_f_1, blast)
apply (case_tac "0  (v x)",
       frule val_pos_mem_Vr[THEN sym, of v x], assumption+, simp,
       frule field_frac1[of x], assumption+,
       frule has_val_one_neq_zero[of v],
       frule Ring.ring_one[of "Vr K v"], simp only:Vr_1_f_1, blast)
apply (frule val_nonpos_inv_pos[of v x], assumption+,
       cut_tac invf_inv[of x], erule conjE,
       frule val_poss_mem_Vr[of v "xK"], assumption+)
apply (frule Ring.ring_one[of "Vr K v"], simp only:Vr_1_f_1,
       frule field_frac2[of x], assumption+)
apply (cut_tac invf_closed1[of x], blast, simp+)
done

lemma (in Corps) valuations_eqTr1:"valuation K v; valuation K v';
 Vr K v = Vr K v'; xcarrier (Vr K v). v x = v' x  v = v'"
apply (rule funcset_eq [of _  "carrier K"],
       simp add:valuation_def, simp add:valuation_def,
       rule ballI,
       frule_tac x = x in frac_Vr_is_K[of v], assumption+,
        (erule bexE)+, simp, erule conjE)
apply (frule_tac x = t in Vr_mem_f_mem[of v'], assumption,
       cut_tac x = t in invf_closed1, simp, simp, erule conjE)
 apply (frule_tac x = s in Vr_mem_f_mem[of "v'"], assumption+,
       simp add:val_t2p, simp add:value_of_inv)
done

lemma (in Corps) ridmap_rhom:" valuation K v; valuation K v';
 carrier (Vr K v)  carrier (Vr K v') 
      ridmap (Vr K v)  rHom (Vr K v) (Vr K v')"
apply (frule Vr_ring[of "v"], frule Vr_ring[of "v'"],
       subst rHom_def, simp, rule conjI)
apply (simp add:aHom_def, rule conjI,
       rule Pi_I, simp add:ridmap_def subsetD,
       simp add:ridmap_def restrict_def extensional_def,
       (rule ballI)+,
       frule Ring.ring_is_ag[of "Vr K v"], simp add:aGroup.ag_pOp_closed,
        simp add:Vr_pOp_f_pOp subsetD)
apply (rule conjI, (rule ballI)+, simp add:ridmap_def,
       simp add:Ring.ring_tOp_closed, simp add:Vr_tOp_f_tOp subsetD,
      frule Ring.ring_one[of "Vr K v"], frule Ring.ring_one[of "Vr K v'"],
      simp add:Vr_1_f_1, simp add:ridmap_def )
done

lemma (in Corps) contract_ideal:"valuation K v; valuation K v';
                 carrier (Vr K v)  carrier (Vr K v') 
                       ideal (Vr K v) (carrier (Vr K v)  vp K v')"
apply (frule_tac ridmap_rhom[of "v" "v'"], assumption+,
      frule Vr_ring[of "v"], frule Vr_ring[of "v'"])
apply (cut_tac TwoRings.i_contract_ideal[of "Vr K v" "Vr K v'"
        "ridmap (Vr K v)" "vp K v'"],
       subgoal_tac "(i_contract (ridmap (Vr K v)) (Vr K v) (Vr K v')
                      (vp K v')) = (carrier (Vr K v)  vp K v')")
       apply simp
apply(thin_tac "ideal (Vr K v) (i_contract (ridmap (Vr K v))
            (Vr K v) (Vr K v') (vp K v'))",
       simp add:i_contract_def invim_def ridmap_def, blast)
apply (simp add:TwoRings_def TwoRings_axioms_def, simp)
 apply (simp add:vp_ideal)
done

lemma (in Corps) contract_prime:"valuation K v; valuation K v';
      carrier (Vr K v)  carrier (Vr K v')  
      prime_ideal (Vr K v) (carrier (Vr K v)  vp K v')"
apply (frule_tac ridmap_rhom[of "v" "v'"], assumption+,
     frule Vr_ring[of "v"],
     frule Vr_ring[of "v'"],
     cut_tac TwoRings.i_contract_prime[of "Vr K v" "Vr K v'" "ridmap (Vr K v)"
        "vp K v'"])
apply (subgoal_tac "(i_contract (ridmap (Vr K v)) (Vr K v) (Vr K v')
          (vp K v')) = (carrier (Vr K v)  vp K v')",
      simp,
      thin_tac "prime_ideal (Vr K v) (i_contract
       (ridmap (Vr K v))  (Vr K  v) (Vr K v') (vp K v'))",
      simp add:i_contract_def invim_def ridmap_def, blast)
apply (simp add:TwoRings_def TwoRings_axioms_def, simp)
apply (simp add:vp_prime)
done

(* ∀x∈carrier K. 0 ≤ (v x) ⟶ 0 ≤ (v' x) *)
lemma (in Corps) valuation_equivTr:"valuation K v; valuation K v';
      x  carrier K;  0 < (v' x); carrier (Vr K v)  carrier (Vr K v')
       0  (v x)"
apply (rule contrapos_pp, simp+,
       frule val_nonpos_inv_pos[of "v" "x"], assumption+,
       case_tac "x = 𝟬K", simp add:value_of_zero[of "v"]) apply (
       cut_tac invf_closed1[of  "x"], simp, erule conjE,
       frule aless_imp_le[of "0" "v (xK)"])
apply (simp add:val_pos_mem_Vr[of v "xK"],
      frule subsetD[of "carrier (Vr K v)" "carrier (Vr K v')" "xK"],
      assumption+,
      frule val_pos_mem_Vr[THEN sym, of "v'" "xK"], assumption+)
apply (simp, simp add:value_of_inv[of "v'" "x"],
       cut_tac ale_minus[of "0" "- v' x"], thin_tac "0  - v' x",
       simp only:a_minus_minus,
       cut_tac aneg_less[THEN sym, of "v' x" "- 0"], simp,
       assumption, simp)
done

lemma (in Corps) contract_maximal:"valuation K v; valuation K v';
  carrier (Vr K v)  carrier (Vr K v') 
  maximal_ideal (Vr K v) (carrier (Vr K v)  vp K v')"
apply (frule Vr_ring[of "v"],
       frule Vr_ring[of "v'"],
       rule Vring_prime_maximal, assumption+,
       simp add:contract_prime)
apply (frule vp_nonzero[of  "v'"],
       frule vp_ideal[of  "v'"],
       frule Ring.ideal_zero[of "Vr K v'" "vp K v'"], assumption+,
       frule sets_not_eq[of "vp K v'" "{𝟬(Vr K v')}"],
       simp add: singleton_sub[of "𝟬(Vr K v')" "carrier (Vr K v')"],
       erule bexE, simp add:Vr_0_f_0)

apply (case_tac "a  carrier (Vr K v)", blast,
       frule_tac x = a in vp_mem_Vr_mem[of "v'"], assumption+,
       frule_tac x = a in Vr_mem_f_mem[of  "v'"], assumption+,
       subgoal_tac "a  carrier (Vr K v)", blast,
       frule_tac x1 = a in val_pos_mem_Vr[THEN sym, of "v"], assumption+,
       simp, frule val_nonpos_inv_pos[of  "v"], assumption+)

apply (frule_tac y = "v (aK)" in aless_imp_le[of "0"],
       cut_tac x = a in invf_closed1, simp,
       frule_tac x = "aK" in val_poss_mem_Vr[of v], simp, assumption+)
apply (frule_tac c = "aK" in subsetD[of "carrier (Vr K v)"
        "carrier (Vr K v')"], assumption+) apply (
        frule_tac x = "aK" in val_pos_mem_Vr[of "v'"],
        simp, simp only:value_of_inv[of "v'"], simp,
        simp add:value_of_inv[of  "v'"])
apply (frule_tac y = "- v' a" in ale_minus[of "0"], simp add:a_minus_minus,
       frule_tac x = a in vp_mem_val_poss[of "v'"], assumption+,
       simp)
done

section "Equivalent valuations"

definition
  v_equiv :: "[_ , 'r  ant, 'r  ant]  bool" where
  "v_equiv K v1 v2  n_val K v1 = n_val K v2"


lemma (in Corps) valuation_equivTr1:"valuation K v; valuation K v';
 xcarrier K. 0  (v x)  0  (v' x) 
                carrier (Vr K v)  carrier (Vr K v')"
apply (frule Vr_ring[of  "v"],
       frule Vr_ring[of  "v'"])
apply (rule subsetI,
       case_tac "x = 𝟬K", simp, simp add:Vr_def Sr_def,
       frule_tac x1 = x in val_pos_mem_Vr[THEN sym, of "v"],
       frule_tac x = x in Vr_mem_f_mem[of "v"],
       simp, frule_tac x = x in Vr_mem_f_mem[of "v"], assumption+)
apply (drule_tac x = x in bspec, simp add:Vr_mem_f_mem)
apply simp
apply (subst val_pos_mem_Vr[THEN sym, of v'], assumption+,
       simp add:Vr_mem_f_mem, assumption+)
done

lemma (in Corps) valuation_equivTr2:"valuation K v; valuation K v';
 carrier (Vr K v)  carrier (Vr K v'); vp K v = carrier (Vr K v)  vp K v'
    carrier (Vr K v')  carrier (Vr K v)"
apply (frule Vr_ring[of "v"], frule Vr_ring[of "v'"])
apply (rule subsetI)
apply (case_tac "x = 𝟬(Vr K v')", simp,
       subst Vr_0_f_0[of "v'"], assumption+,
       subst Vr_0_f_0[of "v", THEN sym], assumption,
       simp add:Ring.ring_zero)
apply (rule contrapos_pp, simp+)
apply (frule_tac x = x in Vr_mem_f_mem[of "v'"], assumption+)
apply (simp add:val_pos_mem_Vr[THEN sym, of "v"])
apply (cut_tac y = "v x" in aneg_le[of "0"], simp)
apply (simp add:Vr_0_f_0[of "v'"])
apply (frule_tac x = "v x" in aless_minus[of _ "0"], simp,
       thin_tac "v x < 0", thin_tac "¬ 0  v x")
apply (simp add:value_of_inv[THEN sym, of "v"])
apply (cut_tac x = x in invf_closed1, simp, simp, erule conjE)
apply (frule_tac x1 = "xK" in vp_mem_val_poss[THEN sym, of "v"],
       assumption, simp, erule conjE)
apply (frule vp_ideal [of "v'"])
apply (frule_tac x = "xK" and r = x in Ring.ideal_ring_multiple[of "Vr K v'"
       "vp K v'"], assumption+)
apply (frule_tac x = "xK" in vp_mem_Vr_mem[of "v'"], assumption+)
apply (frule_tac x = x and y = "xK" in Ring.ring_tOp_commute[of "Vr K v'"],
        assumption+, simp,
        thin_tac "x rVr K v' xK = xK rVr K v' x")
apply (simp add:Vr_tOp_f_tOp)
 apply (cut_tac x = x in  linvf, simp, simp)
 apply (cut_tac field_is_ring, frule Ring.ring_one[of "K"])
 apply (frule ideal_inc_elem0val_whole[of "v'" "1r" "vp K v'"],
        assumption+, simp add:value_of_one, assumption+)
 apply (frule vp_not_whole[of "v'"], simp)
done

lemma (in Corps) eq_carr_eq_Vring:" valuation K v; valuation K v';
     carrier (Vr K v) = carrier (Vr K v')  Vr K v = Vr K v'"
apply (simp add:Vr_def Sr_def)
done

lemma (in Corps) valuations_equiv:"valuation K v; valuation K v';
    xcarrier K. 0  (v x)  0  (v' x)   v_equiv K v v'"
(** step0. preliminaries. **)
apply (frule Vr_ring[of "v"], frule Vr_ring[of "v'"])

(** step1.  show carrier (Vr K v) ⊆ carrier (Vr K v') **)
apply (frule valuation_equivTr1[of "v" "v'"], assumption+)

(** step2.  maximal_ideal (Vr K v) (carrier (Vr K v) ∩ (vp K v')).
    contract of the maximal ideal is prime, and a prime is maximal **)
apply (frule contract_maximal [of "v" "v'"], assumption+)

(** step3. Vring is a local ring, we have (vp K v) =
    (carrier (Vr K v) ∩ (vp  K v')) **)
apply (frule Vr_local[of "v" "(carrier (Vr K v)  vp K v')"],
        assumption+)

(** step4. show  carrier (Vr K v') ⊆ carrier (Vr K v) **)
 apply (frule valuation_equivTr2[of "v" "v'"], assumption+,
        frule equalityI[of "carrier (Vr K v)" "carrier (Vr K v')"],
                                          assumption+,
        thin_tac "carrier (Vr K v)  carrier (Vr K v')",
        thin_tac "carrier (Vr K v')  carrier (Vr K v)")
(** step5. vp K v' = vp K v **)
 apply (frule vp_ideal[of "v'"],
        frule Ring.ideal_subset1[of "Vr K v'" "vp K v'"], assumption,
        simp add:Int_absorb1,
        thin_tac "xcarrier K. 0  v x  0  v' x",
        thin_tac "vp K v'  carrier (Vr K v')",
        thin_tac "ideal (Vr K v') (vp K v')",
        thin_tac "maximal_ideal (Vr K v) (vp K v')")
(** step6. to show v_equiv K v v', we check whether the normal valuations
    derived from the valuations have the same value or not. if (Vr K
(n_valuation K v)) = (Vr K (n_valuation K v')), then we have only to
check the values of the elements in this valuation ring.
We see (Vr K v) = (Vr K  (n_valuation K G a i v)). **)
apply (simp add:v_equiv_def,
       rule valuations_eqTr1[of  "n_val K v" "n_val K v'"],
       (simp add:n_val_valuation)+,
       rule eq_carr_eq_Vring[of  "n_val K v" "n_val K v'"],
       (simp add:n_val_valuation)+,
       subst Vr_n_val_Vr[THEN sym, of "v"], assumption+,
       subst Vr_n_val_Vr[THEN sym, of "v'"], assumption+)
apply (rule ballI,
       frule n_val_valuation[of "v"],
       frule n_val_valuation[of "v'"],
       frule_tac x1 = x in val_pos_mem_Vr[THEN sym, of "n_val K v"],
       simp add:Vr_mem_f_mem, simp,
       frule Vr_n_val_Vr[THEN sym, of "v"], simp,
       thin_tac "carrier (Vr K (n_val K v)) = carrier (Vr K v')",
       frule_tac x1 = x in val_pos_mem_Vr[THEN sym, of "v'"],
                            simp add:Vr_mem_f_mem,
       simp,
       frule_tac x = x in val_pos_n_val_pos[of "v'"],
       simp add:Vr_mem_f_mem, simp,
       frule_tac x = x in ideal_apow_n_val[of "v"],
       simp add:Vr_n_val_Vr[THEN sym, of "v"], simp)
apply (frule eq_carr_eq_Vring[of "v" "v'"], assumption+,
       frule_tac x = x in ideal_apow_n_val[of "v'"], assumption,
       simp add:Vr_n_val_Vr[THEN sym, of "v"],
       thin_tac "Vr K v' p x = vp K v' (Vr K v') (n_val K v x)",
       frule_tac n = "n_val K v' x" and m = "n_val K v x" in
                        Vr_potent_eq[of  "v'"], assumption+,
       frule sym, assumption+)
done

lemma (in Corps) val_equiv_axiom1:"valuation K v  v_equiv K v v"
apply (simp add:v_equiv_def)
done

lemma (in Corps) val_equiv_axiom2:" valuation K v; valuation K v';
      v_equiv K v v'  v_equiv K v' v"
apply (simp add:v_equiv_def)
done

lemma (in Corps) val_equiv_axiom3:" valuation K v; valuation K v';
 valuation K v'; v_equiv K v v'; v_equiv K v' v''   v_equiv K v v''"
apply (simp add:v_equiv_def)
done

lemma (in Corps) n_val_equiv_val:" valuation K v 
                               v_equiv K v (n_val K v)"
apply (frule valuations_equiv[of "v" "n_val K v"], simp add:n_val_valuation)
apply (rule ballI, rule impI, simp add:val_pos_n_val_pos,
       assumption)
done

section "Prime divisors"

definition
  prime_divisor :: "[_, 'b  ant] 
        ('b  ant) set"  ("(2P⇘ _ _)" [96,97]96) where
 "PK v = {v'. valuation K v'  v_equiv K v v'}"

definition
  prime_divisors :: "_  ('b  ant) set set" ("Pdsı" 96) where
  "PdsK = {P. v. valuation K v  P = P K v }"

definition
  normal_valuation_belonging_to_prime_divisor ::
    "[_ ,  ('b  ant) set]  ('b  ant)"  ("(ν⇘_ _)" [96,97]96) where
  K P = n_val K (SOME v. v  P)"

lemma (in Corps) val_in_P_valuation:"valuation K v; v'  PK v 
       valuation K v'"
apply (simp add:prime_divisor_def)
done

lemma (in Corps) vals_in_P_equiv:" valuation K v; v'  PK v 
       v_equiv K v v'"
apply (simp add:prime_divisor_def)
done

lemma (in Corps) v_in_prime_v:"valuation K v  v  PK v"
apply (simp add:prime_divisor_def,
       frule val_equiv_axiom1[of "v"], assumption+)
done

lemma (in Corps) some_in_prime_divisor:"valuation K v 
             (SOME w. w  PK v)   PK v"
apply (subgoal_tac "P K v  {}",
       rule nonempty_some[of "P K v"], assumption+,
       frule v_in_prime_v[of "v"])
apply blast
done

lemma (in Corps) valuation_some_in_prime_divisor:"valuation K v
            valuation K (SOME w. w  PK v)"
apply (frule some_in_prime_divisor[of "v"],
       simp add:prime_divisor_def)
done

lemma (in Corps) valuation_some_in_prime_divisor1:"P  Pds  
                  valuation K (SOME w. w  P)"
apply (simp add:prime_divisors_def, erule exE)
 apply (simp add:valuation_some_in_prime_divisor)
done

lemma (in Corps) representative_of_pd_valuation:
           "P  Pds  valuation K (νK P)"
apply (simp add:prime_divisors_def,
       erule exE, erule conjE,
       simp add:normal_valuation_belonging_to_prime_divisor_def,
       frule_tac v = v in valuation_some_in_prime_divisor)

apply (rule n_val_valuation, assumption+)
done

lemma (in Corps) some_in_P_equiv:"valuation K v 
                  v_equiv K v (SOME w. w  PK v)"
apply (frule some_in_prime_divisor[of v])
apply (rule vals_in_P_equiv, assumption+)
done

lemma (in Corps) n_val_n_val1:"P  Pds   n_val K (νK P) = (νK P)"
apply (simp add: normal_valuation_belonging_to_prime_divisor_def,
       frule valuation_some_in_prime_divisor1[of P])
apply (rule n_val_n_val[of "SOME v. v  P"], assumption+)
done

lemma (in Corps) P_eq_val_equiv:"valuation K v; valuation K v' 
        (v_equiv K v v') = (PK v =  PK v')"
apply (rule iffI,
       rule equalityI,
       rule subsetI, simp add:prime_divisor_def, erule conjE,
       frule val_equiv_axiom2[of "v" "v'"], assumption+,
       rule val_equiv_axiom3[of "v'" "v"], assumption+,
       rule subsetI, simp add:prime_divisor_def, erule conjE)
apply (rule val_equiv_axiom3[of "v" "v'"], assumption+,
       frule v_in_prime_v[of  "v"], simp,
       thin_tac "PK v = PK v'",
       simp add:prime_divisor_def,
       rule val_equiv_axiom2[of "v'" "v"], assumption+)
done

lemma (in Corps) unique_n_valuation:" P  PdsK; P'  Pds 
                (P = P') =  (νK P = νK P')"
apply (rule iffI, simp)
apply (simp add:prime_divisors_def,
       (erule exE)+, (erule conjE)+)
apply (simp add:normal_valuation_belonging_to_prime_divisor_def,
       frule_tac v = v in some_in_P_equiv,
       frule_tac v = va in some_in_P_equiv,
       subgoal_tac "v_equiv K (SOME w. w  PK v) (SOME w. w  PK va)")
apply (frule_tac v = v in some_in_prime_divisor,
       frule_tac v = va in some_in_prime_divisor,
       frule_tac v = v and v' = "SOME w. w  PK v" and v'' =
       "SOME w. w  PK va" in val_equiv_axiom3)
apply (simp add:prime_divisor_def,
       simp add:prime_divisor_def, assumption+,
       frule_tac v = va and v' = "SOME w. w  PK va" in
                      val_equiv_axiom2,
       simp add:prime_divisor_def, assumption+)
apply (frule_tac v = v and v' = "SOME w. w  PK va" and v'' = va in
       val_equiv_axiom3,
      simp add:prime_divisor_def,
      simp add:prime_divisor_def, assumption+,
      frule_tac v = v and v' = va in P_eq_val_equiv, assumption+)
apply simp
apply (simp add:v_equiv_def)
done

lemma (in Corps) n_val_representative:"P  Pds   (νK P)  P"
apply (simp add:prime_divisors_def,
       erule exE, erule conjE,
       simp add:normal_valuation_belonging_to_prime_divisor_def,
       frule_tac v = v in valuation_some_in_prime_divisor,
       frule_tac v = "SOME w. w  PK v" in
           n_val_equiv_val,
       frule_tac v = v in some_in_P_equiv,
       frule_tac v = v and v' = "SOME w. w  P K v" and v'' =
        "n_val K (SOME w. w  PK v)" in val_equiv_axiom3,
       assumption+,
       frule_tac v = v in n_val_valuation,
       simp add:prime_divisor_def, simp add:n_val_valuation)
done

lemma (in Corps) val_equiv_eq_pdiv:" P  PdsK; P' PdsK; valuation K v;
         valuation K v'; v_equiv K v v'; v  P; v'  P'    P = P'"
apply (simp add:prime_divisors_def,
       (erule exE)+, (erule conjE)+)
apply (rename_tac w w',
       frule_tac v = w in vals_in_P_equiv[of _ "v"], simp,
       frule_tac v = w' in vals_in_P_equiv[of _ "v'"], simp,
       frule_tac v = w and v' = v and  v'' = v' in val_equiv_axiom3,
       assumption+,
       frule_tac v = w' in val_equiv_axiom2[of _ "v'"], assumption+,
       frule_tac v = w and v' = v' and  v'' = w' in val_equiv_axiom3,
          assumption+) apply simp+
apply (simp add:P_eq_val_equiv)
done

lemma (in Corps) distinct_p_divisors:" P  PdsK; P'  PdsK 
          (¬ P = P') =  (¬ v_equiv K (νK P) (νK P'))"
apply (rule iffI,
       rule contrapos_pp, simp+,
       frule val_equiv_eq_pdiv[of "P" "P'" K P" K P'"], assumption+,
       simp add: representative_of_pd_valuation,
       simp add: representative_of_pd_valuation, assumption)
apply (rule n_val_representative[of "P"], assumption,
       rule n_val_representative[of "P'"], assumption,
       simp,
       rule contrapos_pp, simp+, frule sym, thin_tac "P = P'",
       simp,
       frule representative_of_pd_valuation[of P],
       frule val_equiv_axiom1[of K P"], simp)
done

section "Approximation"

definition
  valuations :: "[_ , nat, nat  ('r  ant)]  bool" where
  "valuations K n vv  (j  n. valuation K (vv j))"

definition
  vals_nonequiv :: "[_, nat, nat  ('r  ant)]  bool" where
  "vals_nonequiv K n vv  valuations K n vv 
  (jn. l  n. j  l  ¬ (v_equiv K (vv j) (vv l)))"

definition
  Ostrowski_elem :: "[_, nat, nat  ('b  ant), 'b]  bool" where
  "Ostrowski_elem K n vv x 
       (0 < (vv 0 (1rK ±K (-aK x))))   (jnset (Suc 0) n. 0 < (vv j x))"

 (** vv 0, vv 1, vv 2,…, vv n are valuations **)

lemma (in Corps) Ostrowski_elem_0:"vals_nonequiv K n vv; x  carrier K;
 Ostrowski_elem K n vv x  0 < (vv 0 (1r ± (-a x)))"
apply (simp add:Ostrowski_elem_def)
done

lemma (in Corps) Ostrowski_elem_Suc:"vals_nonequiv K n vv; x  carrier K;
  Ostrowski_elem K n vv x; j  nset (Suc 0) n  0 < (vv j x)"
apply (simp add:Ostrowski_elem_def)
done

lemma (in Corps) vals_nonequiv_valuation:"vals_nonequiv K n vv; m  n 
       valuation K (vv m)"
apply (simp add:vals_nonequiv_def, erule conjE)
 apply (thin_tac "jn. l n. j  l  ¬ v_equiv K (vv j) (vv l)")
 apply (simp add:valuations_def)
done

lemma (in Corps) vals_nonequiv:" vals_nonequiv K (Suc (Suc n)) vv;
 i  (Suc (Suc n)); j  (Suc (Suc n)); i  j 
                                   ¬ (v_equiv K (vv i) (vv j))"
apply (simp add:vals_nonequiv_def)
done

lemma (in Corps) skip_vals_nonequiv:"vals_nonequiv K (Suc (Suc n)) vv 
  vals_nonequiv K (Suc n) (compose {l. l  (Suc n)} vv (skip j))"
apply (subst vals_nonequiv_def)
apply (rule conjI)
apply (subst valuations_def, rule allI, rule impI,
       simp add:compose_def)
apply (cut_tac l = ja and n = "Suc n" in skip_mem[of _ _ "j"], simp,
       frule_tac m = "skip j ja" in vals_nonequiv_valuation[of
         "Suc (Suc n)" "vv"], simp, assumption)
apply ((rule allI, rule impI)+, rule impI,
       cut_tac l = ja and n = "Suc n" in skip_mem[of _ _ "j"], simp,
       cut_tac l = l and n = "Suc n" in skip_mem[of _ _ "j"], simp+)
apply (cut_tac i = ja and j = l in skip_inj[of _ "Suc n" _ "j"], simp+,
       simp add:compose_def,
       rule_tac i = "skip j ja" and j = "skip j l" in
       vals_nonequiv[of "n"], assumption+)
done

lemma (in Corps) not_v_equiv_reflex:"valuation K v; valuation K v';
 ¬ v_equiv K v v'  ¬ v_equiv K v' v "
apply (simp add:v_equiv_def)
done

lemma (in Corps) nonequiv_ex_Ostrowski_elem:"valuation K v; valuation K v';
 ¬ v_equiv K v v'  xcarrier K. 0  (v x)  (v' x) < 0"
 apply (subgoal_tac "¬ (xcarrier K. 0  (v x)  0  (v' x))")
 prefer 2
 apply (rule contrapos_pp, simp+,
        frule valuations_equiv[of "v" "v'"], assumption+,
        simp add:val_equiv_axiom2[of v v'])
apply (simp, erule bexE, erule conjE, simp add:aneg_le)
 apply blast
done

lemma (in Corps) field_op_minus:"a  carrier K; b  carrier K; b  𝟬 
                              -a (a r (bK)) = (-a a) r (bK)"
apply (cut_tac invf_closed1[of "b"], simp,
       erule conjE, cut_tac field_is_ring,
        simp add:Ring.ring_inv1[of "K" "a" "bK"], simp)
done

lemma (in Corps) field_one_plus_frac1:"a  carrier K; b  carrier K; b  𝟬
  1r ± (a r (bK)) = (b ± a) r (bK)"
apply (cut_tac field_is_ring,
       cut_tac invf_closed1[of b], simp+, erule conjE,
       cut_tac field_is_idom)
 apply (rule Idomain.idom_mult_cancel_r[of K "1r ± (a r (bK))"
        "(b ± a) r (bK)" "b"],  assumption+,
       frule Idomain.idom_is_ring[of "K"], frule Ring.ring_is_ag[of "K"],
       rule aGroup.ag_pOp_closed [of "K"], assumption+,
       simp add:Ring.ring_one,rule Ring.ring_tOp_closed, assumption+,
       rule Ring.ring_tOp_closed, assumption+,
       frule Ring.ring_is_ag[of "K"],
       rule aGroup.ag_pOp_closed, assumption+,
       subst Ring.ring_distrib2[of "K" "b"], assumption+,
       simp add:Ring.ring_one, simp add:Ring.ring_tOp_closed,
       simp add:Ring.ring_l_one) thm Ring.ring_distrib2[of K "bK"]
 apply (subst Ring.ring_distrib2[of K "bK"], assumption+,
       simp add:Ring.ring_tOp_commute[of "K" "b" "bK"],
       subst linvf[of "b"], simp,
       subst  Ring.ring_distrib2[of "K" "b"], assumption+,
       simp add:Ring.ring_one, simp add:Ring.ring_tOp_closed,
       simp add:Ring.ring_l_one, simp)
done

lemma (in Corps) field_one_plus_frac2:"a  carrier K; b  carrier K;
 a ± b  𝟬   1r ± (-a (a r (a ± b)K)) = b r ((a ± b)K)"
apply (frule field_op_minus[of "a" "a ± b"],
       cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       simp add:aGroup.ag_pOp_closed, assumption, simp,
       thin_tac "-a (a r (a ± b)K) = (-a a) r (a ± b)K")
 apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
        frule aGroup.ag_mOp_closed[of "K" "a"], assumption,
        frule field_one_plus_frac1[of "-a a" "a ± b"],
        simp add:aGroup.ag_pOp_closed, simp, simp,
        thin_tac "1r ± (-a a) r (a ± b)K = (a ± b ± -a a) r (a ± b)K",
        simp add:aGroup.ag_pOp_assoc[of "K" "a" "b" "-a a"],
        simp add:aGroup.ag_pOp_commute[of "K" "b" "-a a"],
        simp add:aGroup.ag_pOp_assoc[THEN sym],
        simp add:aGroup.ag_r_inv1,
        simp add:aGroup.ag_l_zero)
done

lemma (in Corps) field_one_plus_frac3:"x  carrier K; x  1r;
      1r ± x r (1r ± -a x)  𝟬  
      1r ± -a x r (1r ± x r (1r ± -a x))K =
                    (1r ± -a x^K (Suc (Suc 0))) r (1r ± x r (1r ± -a x))K"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag, frule Ring.ring_one,
       cut_tac invf_closed1[of "1r ± x r (1r ± -a x)"], simp, erule conjE)
apply (subst Ring.ring_inv1_1, assumption+,
        subst field_one_plus_frac1[of "-a x" "1r ± x r (1r ± -a x)"])
 apply (rule aGroup.ag_mOp_closed, assumption+,
        rule aGroup.ag_pOp_closed, assumption+,
        rule Ring.ring_tOp_closed, assumption+)
 apply (rule aGroup.ag_pOp_closed, assumption+, rule aGroup.ag_mOp_closed,
        assumption+,
        subst Ring.ring_distrib1, assumption+,
        rule aGroup.ag_mOp_closed, assumption+)
 apply (simp add:Ring.ring_r_one)
 apply (simp add:Ring.ring_inv1_2[THEN sym, of K x x])
 apply (subgoal_tac "1r ± (x ± -a x r x) ± -a x = 1r ± -a x^K (Suc (Suc 0))",
        simp,
        frule Ring.ring_tOp_closed[of K x x], assumption+)

 apply (frule Ring.ring_tOp_closed[of K x x], assumption+,
        frule aGroup.ag_mOp_closed[of K "x r x"], assumption+,
        frule aGroup.ag_mOp_closed[of K x], assumption+)
 apply (subst aGroup.ag_pOp_assoc, assumption+,
        rule aGroup.ag_pOp_closed, assumption+)
  apply (rule aGroup.ag_pOp_add_l[of K "x ± -a x r x ± -a x"
         "-a x^K (Suc (Suc 0))" "1r"], assumption+,
         (rule aGroup.ag_pOp_closed, assumption+)+,
         rule aGroup.ag_mOp_closed, assumption+, rule Ring.npClose,
         assumption+,
         subst aGroup.ag_pOp_commute, assumption+,
         simp add:aGroup.ag_pOp_assoc aGroup.ag_r_inv1 aGroup.ag_r_zero)
   apply (simp add:Ring.ring_l_one)
apply simp
 apply (rule aGroup.ag_pOp_closed, assumption+,
        rule Ring.ring_tOp_closed, assumption+,
        rule aGroup.ag_pOp_closed, assumption+,
        rule aGroup.ag_mOp_closed[of K x], assumption+)
done

lemma (in Corps) OstrowskiTr1:" valuation K v; s  carrier K; t  carrier K;
      0  (v s); v t < 0   s ± t  𝟬"
apply (rule contrapos_pp, simp+,
       cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       simp only:aGroup.ag_plus_zero[THEN sym, of "K" "s" "t"])
apply (simp add:val_minus_eq[of "v" "t"])
done

lemma (in Corps) OstrowskiTr2:"valuation K v; s  carrier K; t  carrier K;
  0  (v s); v t < 0   0 < (v (1r ± (-a ((t r ((s ± t)K))))))"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule OstrowskiTr1[of "v" "s" "t"], assumption+,
       frule field_one_plus_frac2[of "t" "s"], assumption+,
       simp add:aGroup.ag_pOp_commute)
apply (subst aGroup.ag_pOp_commute[of "K" "s" "t"], assumption+, simp,
       simp add:aGroup.ag_pOp_commute[of "K" "t" "s"],
       thin_tac "1r ± -a (t r (s ± t)K) = s r (s ± t)K",
       frule aGroup.ag_pOp_closed[of "K" "s" "t"], assumption+,
       cut_tac invf_closed1[of "s ± t"], simp, erule conjE)
apply (simp add:val_t2p,
       simp add:value_of_inv,
       frule aless_le_trans[of "v t" "0" "v s"], assumption+,
       frule value_less_eq[THEN sym, of v t s], assumption+,
       simp add:aGroup.ag_pOp_commute,
       frule aless_diff_poss[of "v t" "v s"], simp add:diff_ant_def, simp)
done

lemma (in Corps) OstrowskiTr3:"valuation K v; s  carrier K; t  carrier K;
      0  (v t); v s < 0   0 < (v (t r (( s ± t)K)))"
apply (frule aless_le_trans[of "v s" "0" "v t"], assumption+,
       cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule aGroup.ag_pOp_closed[of "K" "s" "t"], assumption+,
       frule OstrowskiTr1[of v t s], assumption+,
       frule value_less_eq[THEN sym, of v s t], assumption+)
apply (simp add:aGroup.ag_pOp_commute[of K t s],
       cut_tac invf_closed1[of "s ± t"], simp) apply (
       erule conjE, simp add:val_t2p[of v], simp add:value_of_inv)
       apply (cut_tac aless_diff_poss[of "v s" "v t"],
              simp add:diff_ant_def, simp+)
done

lemma (in Corps) restrict_Ostrowski_elem:" x  carrier K;
  Ostrowski_elem K (Suc (Suc n)) vv x  Ostrowski_elem K (Suc n) vv x"
apply (simp add:Ostrowski_elem_def,
       erule conjE, rule ballI, simp add:nset_def,
       insert lessI [of "Suc n"])
done

lemma (in Corps) restrict_vals_nonequiv:"vals_nonequiv K (Suc (Suc n)) vv 
                  vals_nonequiv K (Suc n) vv"
apply (simp add:vals_nonequiv_def,
       erule conjE, simp add:valuations_def)
done

lemma (in Corps) restrict_vals_nonequiv1:"vals_nonequiv K (Suc (Suc n)) vv 
       vals_nonequiv K (Suc n) (compose {h. h  (Suc n)} vv (skip 1))"
apply (simp add:vals_nonequiv_def, (erule conjE)+,
       rule conjI,
       thin_tac "jSuc (Suc n). lSuc (Suc n). j  l 
                                       ¬ v_equiv K (vv j) (vv l)",
      simp add:valuations_def, rule allI, rule impI,
      simp add:compose_def skip_def nset_def)
 apply ((rule allI, rule impI)+, rule impI)
 apply (simp add:compose_def skip_def nset_def)
done

lemma (in Corps) restrict_vals_nonequiv2:"vals_nonequiv K (Suc (Suc n)) vv
       vals_nonequiv K (Suc n) (compose {j. j  (Suc n)} vv (skip 2))"
apply (simp add:vals_nonequiv_def, (erule conjE)+,
      rule conjI,
      thin_tac "jSuc (Suc n). lSuc (Suc n). j  l 
                                              ¬ v_equiv K (vv j) (vv l)",
      simp add:valuations_def,
      rule allI, rule impI)
 apply (simp add:compose_def skip_def nset_def,
       (rule allI, rule impI)+, rule impI,
       simp add:compose_def skip_def nset_def)
done

lemma (in Corps)  OstrowskiTr31:"valuation K v; s  carrier K;
        0 < (v (1r ± (-a s)))  s  𝟬"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"])
apply (rule contrapos_pp, simp+)
 apply (simp add:aGroup.ag_inv_zero,
        frule Ring.ring_one[of "K"], simp add:aGroup.ag_r_zero)
 apply (simp add:value_of_one)
done

lemma (in Corps) OstrowskiTr32:"valuation K v; s  carrier K;
           0 < (v (1r ± (-a s)))  0  (v s)"
apply (rule contrapos_pp, simp+,
       cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       simp add:aneg_le,
       frule has_val_one_neq_zero[of "v"])
apply (frule OstrowskiTr31[of v s], assumption+,
       frule not_sym,
       frule Ring.ring_one[of "K"])
apply (frule value_less_eq[THEN sym, of v "-a s" "1r"],
       simp add:aGroup.ag_mOp_closed, assumption+,
       simp add:val_minus_eq)
apply (simp add:value_of_one,
       frule aGroup.ag_mOp_closed[of "K" "s"], assumption+,
       simp add:aGroup.ag_pOp_commute[of "K" "-a s" "1r"],
       simp add:val_minus_eq)
done

lemma (in Corps) OstrowskiTr4:"valuation K v; s  carrier K; t  carrier K;
      0 < (v (1r ± (-a s))); 0 < (v (1r ± (-a t)))  
                              0 < (v (1r ± (-a (s r t))))"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule Ring.ring_one[of "K"])
apply (subgoal_tac "1r ± (-a (s r t)) =
                    1r ± (-a s) ± (s r (1r ± (-a t)))", simp,
       thin_tac "1r ± -a (s r t) = 1r ± -a s ± s r (1r ± -a t)")
apply (frule aGroup.ag_mOp_closed[of K s], assumption+,
       frule aGroup.ag_pOp_closed[of K "1r" "-a s"], assumption+,
       frule aGroup.ag_mOp_closed[of "K" "t"], assumption+,
       frule aGroup.ag_pOp_closed[of "K" "1r" "-a t"], assumption+,
       frule Ring.ring_tOp_closed[of "K" "s" "1r ± (-a t)"], assumption+,
       frule amin_le_plus[of v "1r ± (-a s)" "s r (1r ± (-a t))"], assumption+)
apply (frule amin_gt[of "0" "v (1r ± -a s)" "v (s r (1r ± -a t))"])
apply (simp add:val_t2p,
       frule OstrowskiTr32[of v s], assumption+,
       rule aadd_pos_poss[of "v s" "v (1r ± -a t)"], assumption+,
       simp add:Ring.ring_distrib1)
apply (frule aGroup.ag_mOp_closed[of K t], assumption,
       simp add:Ring.ring_distrib1 Ring.ring_r_one,
       frule aGroup.ag_mOp_closed[of K s], assumption+,
       subst aGroup.pOp_assocTr43, assumption+,
       simp add:Ring.ring_tOp_closed,
       simp add:aGroup.ag_l_inv1 aGroup.ag_r_zero,
       simp add:Ring.ring_inv1_2)
done

lemma (in Corps) OstrowskiTr5:" vals_nonequiv K (Suc (Suc n)) vv;
  s  carrier K; t  carrier K;
  0  (vv (Suc 0)) s  0  (vv (Suc (Suc 0))) t;
  Ostrowski_elem K (Suc n) (compose {j. j  (Suc n)} vv (skip 1)) s;
  Ostrowski_elem K (Suc n) (compose {j. j  (Suc n)} vv (skip 2)) t 
  Ostrowski_elem K (Suc (Suc n)) vv (s r t)"
apply (erule conjE,
       cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule_tac x = s and y = t in Ring.ring_tOp_closed[of "K"], assumption+,
       frule skip_vals_nonequiv[of n "vv" "1"],
       frule skip_vals_nonequiv[of n "vv" "2"],
       subst Ostrowski_elem_def, rule conjI)

apply (rule  OstrowskiTr4,
       simp add:vals_nonequiv_valuation[of "Suc (Suc n)" "vv" "0"],
       assumption+,
       frule Ostrowski_elem_0[of  "Suc n"
         "compose {j. j  (Suc n)} vv (skip 1)" "s"], assumption+,
       simp add:skip_def compose_def,
       frule Ostrowski_elem_0[of "Suc n"
         "compose {j. j  (Suc n)} vv (skip 2)" "t"], assumption+,
       simp add:skip_def compose_def)

apply (rule ballI,
      case_tac "j = Suc 0",
      frule_tac j = " Suc 0" in Ostrowski_elem_Suc[of "Suc n"
        "compose {j. j  (Suc n)} vv (skip 2)" "t"], assumption+,
        simp add:nset_def) apply (
 thin_tac "Ostrowski_elem K (Suc n) (compose {j. j  Suc n} vv (skip 1)) s",
 thin_tac "Ostrowski_elem K (Suc n) (compose {j. j  Suc n} vv (skip 2)) t",
 thin_tac "vals_nonequiv K (Suc n) (compose {l. l  Suc n} vv (skip 1))",
      frule vals_nonequiv_valuation[of  "Suc n"
       "compose {j. j  (Suc n)} vv (skip 2)" "Suc 0"])
 apply simp+
 apply (simp add:skip_def compose_def,
        simp add:val_t2p, simp add:aadd_pos_poss)

 (** Ostrowski_elem_Suc case j = Suc (Suc 0) **)
apply (case_tac "j = Suc (Suc 0)",
       frule vals_nonequiv_valuation[of "Suc n"
        "compose {j. j  Suc n} vv (skip 1)" "Suc 0"],
        simp,
       frule_tac j = " Suc 0" in Ostrowski_elem_Suc[of "Suc n"
        "compose {j. j  (Suc n)} vv (skip 1)" "s"],
         assumption+, simp add:nset_def,
         simp add:skip_def compose_def,
       simp add:val_t2p, rule aadd_poss_pos, assumption+)
apply (frule_tac j = j in nsetTr1[of _ "Suc 0" "Suc (Suc n)"], assumption,
       frule_tac j = j in nsetTr2[of _ "Suc 0" "Suc n"],
       thin_tac "j  nset (Suc (Suc 0)) (Suc (Suc n))",
       frule_tac j = "j - Suc 0" in Ostrowski_elem_Suc[of "Suc n"
                "compose {j. j  (Suc n)} vv (skip 1)" "s"], assumption+)

apply (frule_tac j = "j - Suc 0" in Ostrowski_elem_Suc[of "Suc n"
                 "compose {j. j  (Suc n)} vv (skip 2)" "t"], assumption+,
 thin_tac "Ostrowski_elem K (Suc n) (compose {j. j  (Suc n)} vv (skip 1)) s",
 thin_tac "Ostrowski_elem K (Suc n) (compose {j. j  (Suc n)} vv (skip 2)) t",
 thin_tac "vals_nonequiv K (Suc n) (compose {j. j  (Suc n)} vv (skip 1))",
 thin_tac "vals_nonequiv K (Suc n) (compose {j. j  (Suc n)} vv (skip 2))")

apply (simp add:compose_def skip_def nset_def,
      (erule conjE)+, simp, subgoal_tac "¬ (j - Suc 0  Suc 0)", simp)
apply (frule_tac m = j in vals_nonequiv_valuation[of "Suc (Suc n)"],
       assumption+,
      simp add:val_t2p,
      rule_tac x = "vv j s" and y = "vv j t" in aadd_pos_poss,
      simp add:aless_imp_le, assumption)
apply simp
done

lemma (in Corps) one_plus_x_nonzero:"valuation K v; x  carrier K; v x < 0
       1r ± x  carrier K  v (1r ± x) < 0"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule Ring.ring_one[of "K"],
       frule aGroup.ag_pOp_closed[of "K" "1r" "x"], assumption+,
       simp)
apply (frule value_less_eq[of "v" "x" "1r"], assumption+,
       simp add:value_of_one, simp add:aGroup.ag_pOp_commute)
done

lemma (in Corps)  val_neg_nonzero:"valuation K v; x  carrier K; v x < 0 
                                     x  𝟬"
apply (rule contrapos_pp, simp+, simp add:value_of_zero)
apply (frule aless_imp_le[of "" "0"],
        cut_tac inf_ge_any[of "0"],
        frule ale_antisym[of "0" ""], assumption+, simp)
done

lemma (in Corps) OstrowskiTr6:"valuation K v; x  carrier K; ¬ 0  (v x) 
       (1r ± x r (1r ± -a x))  carrier K - {𝟬}"
apply (simp add:aneg_le,
       cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule aGroup.ag_mOp_closed[of "K" "x"], assumption+,
       frule one_plus_x_nonzero[of "v" "-a x"], assumption+,
        simp add:val_minus_eq, erule conjE)

apply (rule conjI,
       rule aGroup.ag_pOp_closed[of "K"], assumption+,
       simp add:Ring.ring_one, rule Ring.ring_tOp_closed[of "K"], assumption+)

apply (frule val_t2p[of v x "1r ± (-a x)"], assumption+,
       frule val_neg_nonzero[of v x], assumption+,
       frule val_nonzero_z[of v x], assumption+, erule exE,
       frule_tac z = z in aadd_less_mono_z[of "v (1r ± (-a x))" "0"],
       simp add:aadd_0_l,
       simp only:aadd_commute[of "v (1r ± -a x)"],
       frule_tac x = "ant z + v (1r ± -a x)" and y ="ant z" in
         aless_trans[of _ _ "0"], assumption,
       drule sym, simp)

apply (frule_tac x = x and y = "1r ± -a x" in Ring.ring_tOp_closed[of "K"],
             assumption+,
       frule one_plus_x_nonzero[of v "x r (1r ± (-a x))"],
                      assumption+, erule conjE,
       rule val_neg_nonzero[of v], assumption+)
done

lemma (in Corps) OstrowskiTr7:"valuation K v; x  carrier K; ¬ 0  (v x) 
  1r ± -a (x r ((1r ± x r (1r ± -a x))K)) =
     (1r ± -a x ± x r (1r ± -a x)) r ((1r ± x r (1r ± -a x))K)"
apply (cut_tac field_is_ring,
       frule OstrowskiTr6[of v x], assumption+, simp, erule conjE,
       cut_tac field_is_idom,
       cut_tac invf_closed1[of "1r ± x r (1r ± -a x)"], simp,
       frule Ring.ring_is_ag[of "K"],
       frule aGroup.ag_mOp_closed[of "K" "x"], assumption+,
       frule Ring.ring_one[of "K"],
       frule aGroup.ag_pOp_closed[of "K" "1r" "-a x"], assumption+,
       rule Idomain.idom_mult_cancel_r[of K "1r ± -a (x r ((1r ± x r
       (1r ± -a x))K))" "(1r ± -a x ± x r (1r ± -a x)) r
       ((1r ±  x r (1r ± -a x))K)" "(1r ± x r (1r ± -a x))"],
       assumption+)
apply (rule aGroup.ag_pOp_closed, assumption+, rule aGroup.ag_mOp_closed,
       assumption+,
       rule Ring.ring_tOp_closed, assumption+, simp, rule Ring.ring_tOp_closed,
       assumption+,
       (rule aGroup.ag_pOp_closed, assumption+)+,
       rule  Ring.ring_tOp_closed, assumption+, simp, assumption+,
       subst Ring.ring_tOp_assoc, assumption+,
       rule aGroup.ag_pOp_closed, assumption+,
       simp add:Ring.ring_tOp_closed, simp, simp)
apply (subst linvf[of "1r ± x r (1r ± -a x)"], simp,
       (subst Ring.ring_distrib2, assumption+)+, erule conjE)
apply (rule aGroup.ag_mOp_closed, assumption,
       rule Ring.ring_tOp_closed, assumption+,
       subst Ring.ring_r_one, assumption+)
apply (rule aGroup.ag_pOp_closed, assumption+,
       rule Ring.ring_tOp_closed, assumption+,
       erule conjE,
       simp add:Ring.ring_inv1_1,
       simp add:Ring.ring_tOp_assoc[of K "-a x" "(1r ± x r (1r ± -a x))K"],
       simp add:linvf, simp add:Ring.ring_r_one Ring.ring_l_one,
       frule Ring.ring_tOp_closed[of K x "1r ± -a x"], assumption+,
       simp add:aGroup.ag_pOp_assoc, simp add:aGroup.ag_pOp_commute)
apply simp
done

lemma (in Corps) Ostrowski_elem_nonzero:"vals_nonequiv K (Suc n) vv;
 x  carrier K; Ostrowski_elem K (Suc n) vv x  x  𝟬"
apply (simp add:Ostrowski_elem_def,
       frule conjunct1, fold Ostrowski_elem_def,
       frule vals_nonequiv_valuation[of "Suc n" "vv" "0"], simp)
apply (rule contrapos_pp, simp+,
       cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       simp add:aGroup.ag_inv_zero, frule Ring.ring_one[of "K"],
       simp add:aGroup.ag_r_zero, simp add:value_of_one)
done

lemma (in Corps) Ostrowski_elem_not_one:"vals_nonequiv K (Suc n) vv;
      x  carrier K; Ostrowski_elem K (Suc n) vv x    1r ± -a x  𝟬"
apply (frule vals_nonequiv_valuation [of "Suc n" "vv" "Suc 0"],
       simp,
       simp add:Ostrowski_elem_def, frule conjunct2,
       fold Ostrowski_elem_def)
apply (subgoal_tac "0 < (vv (Suc 0) x)",
       rule contrapos_pp, simp+,
       cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule Ring.ring_one[of "K"],
       simp only:aGroup.ag_eq_diffzero[THEN sym, of "K" "1r" "x"],
       drule sym, simp, simp add:value_of_one,
       subgoal_tac "Suc 0  nset (Suc 0) (Suc n)", simp,
       simp add:nset_def)
done

lemma (in Corps) val_unit_cond:" valuation K v; x  carrier K;
      0 < (v (1r ± -a x))   v x = 0"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule Ring.ring_one[of "K"])

apply (frule aGroup.ag_mOp_closed[of "K" "1r"], assumption+,
       frule has_val_one_neq_zero[of v])

apply (frule aGroup.ag_pOp_assoc[of "K" "-a 1r" "1r" "-a x"], assumption+,
       simp add:aGroup.ag_mOp_closed, simp add:aGroup.ag_l_inv1,
       frule aGroup.ag_mOp_closed[of "K" "x"], assumption+,
       simp add:aGroup.ag_l_zero)
apply (subgoal_tac "v (-a x) = v ( -a 1r ± (1r ± -a x))") prefer 2
  apply simp
apply (thin_tac "-a x =  -a 1r ± (1r ± -a x)",
       frule value_less_eq[of "v" "-a 1r" "1r ± -a x"],
                                  assumption+,
       rule aGroup.ag_pOp_closed, assumption+,
       simp add:val_minus_eq value_of_one, simp add:val_minus_eq)
apply (simp add: value_of_one)
done

end

Theory Valuation2

(**        Valuation2  
                            author Hidetsune Kobayashi
                            Group You Santo
                            Department of Mathematics
                            Nihon University
                            h_coba@math.cst.nihon-u.ac.jp
                            June 24, 2005
                            July 20  2007

   chapter 1. elementary properties of a valuation
     section 8. approximation(continued)
    
   **)

theory Valuation2 
imports Valuation1
begin

lemma (in Corps) OstrowskiTr8:"valuation K v; x  carrier K; 
      0 < v (1r ± -a x) 
      0 < (v (1r ± -a (x r ((1r ± x r (1r ± -a x))K))))"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"])
apply (frule aGroup.ag_mOp_closed[of "K" "x"], assumption+,
       frule Ring.ring_one[of "K"],
       frule aGroup.ag_pOp_closed[of "K" "1r" " -a x"], assumption+, 
       frule OstrowskiTr32[of v x], assumption+)
apply (case_tac "x = 1rK", simp,
       simp add:aGroup.ag_r_inv1, simp add:Ring.ring_times_x_0,
       simp add:aGroup.ag_r_zero, cut_tac val_field_1_neq_0,
       cut_tac invf_one, simp, simp add:Ring.ring_r_one,
       simp add:aGroup.ag_r_inv1, assumption+)
apply (frule aGroup.ag_pOp_closed[of K "1r" "x r (1r ± -a x)"], assumption+, 
       rule Ring.ring_tOp_closed, assumption+)
 apply (cut_tac invf_closed[of "1r ± x r (1r ± -a x)"])

 apply (cut_tac field_one_plus_frac3[of x], simp del:npow_suc,
        subst val_t2p[of v], assumption+)
 apply (rule aGroup.ag_pOp_closed, assumption+,
        rule aGroup.ag_mOp_closed, assumption+, rule Ring.npClose, 
        assumption+,
        thin_tac "1r ± -a x r (1r ± x r (1r ± -a x))K =
        (1r ± -a x^K (Suc (Suc 0))) r (1r ± x r (1r ± -a x))K",
        subgoal_tac "1r ± -a x^K (Suc (Suc 0)) = (1r ± x) r (1r ± -a x)",
        simp del:npow_suc,
        thin_tac "1r ± -a x^K (Suc (Suc 0)) = (1r ± x) r (1r ± -a x)")
 apply (subst val_t2p[of v], assumption+,
        rule aGroup.ag_pOp_closed, assumption+,
        subst value_of_inv[of v "1r ± x r (1r ± -a x)"], tactic ‹CHANGED distinct_subgoals_tac›, assumption+)

 apply (rule contrapos_pp, simp+,
        frule Ring.ring_tOp_closed[of K x "(1r ± -a x)"], assumption+,
        simp add:aGroup.ag_pOp_commute[of K "1r"],
        frule aGroup.ag_eq_diffzero[THEN sym, of K "x r (-a x ± 1r)" "-a 1r"],
        assumption+, rule aGroup.ag_mOp_closed, assumption+)
 apply (simp add:aGroup.ag_inv_inv[of K "1r"],
        frule eq_elems_eq_val[of "x r (-a x ± 1r)" "-a 1r" v],
        thin_tac "x r (-a x ± 1r) = -a 1r",
        simp add:val_minus_eq value_of_one)
        apply (simp add:val_t2p,
               frule aadd_pos_poss[of "v x" "v (-a x ± 1r)"], assumption+,
               simp,
               subst value_less_eq[THEN sym, of v "1r" "x r (1r ± -a x)"],
               assumption+,
               rule Ring.ring_tOp_closed, assumption+,
               simp add:value_of_one, subst val_t2p[of v], assumption+,
               rule aadd_pos_poss[of "v x" "v (1r ± -a x)"], assumption+,
               simp add:value_of_one,
               cut_tac aadd_pos_poss[of "v (1r ± x)" "v (1r ± -a x)"],
               simp add:aadd_0_r, rule val_axiom4, assumption+)
  apply (subst Ring.ring_distrib2, assumption+, simp add:Ring.ring_l_one,
         subst Ring.ring_distrib1, assumption+, simp add:Ring.ring_r_one,
         subst aGroup.pOp_assocTr43, assumption+, 
         rule Ring.ring_tOp_closed, assumption+,
         simp add:aGroup.ag_l_inv1 aGroup.ag_r_zero,
        subst Ring.ring_inv1_2, assumption+, simp, assumption+)

 apply simp

apply (rule contrapos_pp, simp+,
       frule Ring.ring_tOp_closed[of K x "(1r ± -a x)"], assumption+,
       simp add:aGroup.ag_pOp_commute[of K "1r"],
       frule aGroup.ag_eq_diffzero[THEN sym, of K "x r (-a x ± 1r)" "-a 1r"],
       assumption+, rule aGroup.ag_mOp_closed, assumption+)
 apply (simp add:aGroup.ag_inv_inv[of K "1r"],
        frule eq_elems_eq_val[of "x r (-a x ± 1r)" "-a 1r" v],
        thin_tac "x r (-a x ± 1r) = -a 1r",
        simp add:val_minus_eq value_of_one,
        simp add:val_t2p,
        frule aadd_pos_poss[of "v x" "v (-a x ± 1r)"], assumption+,
        simp)
done

lemma (in Corps) OstrowskiTr9:"valuation K v; x  carrier K; 0 < (v x) 
                 0 < (v (x r ((1r ± x r (1r ± -a x))K)))"
apply (subgoal_tac "1r ± x r (1r ± -a x)  𝟬")
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule aGroup.ag_mOp_closed[of "K" "x"], assumption+,
       frule Ring.ring_one[of "K"], 
       frule aGroup.ag_pOp_closed[of "K" "1r" "-a x"], assumption+,
       subst val_t2p, assumption+,
       cut_tac invf_closed1[of "1r ± x r (1r ± -a x)"], simp) 
apply simp
 apply (rule aGroup.ag_pOp_closed, assumption+,
        rule Ring.ring_tOp_closed, assumption+)
(* 
 apply (rule contrapos_pp, simp+,
       frule Ring.ring_tOp_closed[of K x "(1r ± -a x)"], assumption+) apply (
       simp add:aGroup.ag_pOp_commute[of K "1r"],
       frule aGroup.ag_eq_diffzero[THEN sym, of K "x ⋅r (-a x ± 1r)" "-a 1r"])
       apply (rule Ring.ring_tOp_closed, assumption+,
              rule aGroup.ag_mOp_closed, assumption+)
       apply (simp add:aGroup.ag_inv_inv)
       apply (frule eq_elems_eq_val[of "x ⋅r (-a x ± 1r)" "-a 1r" v],
        thin_tac "x ⋅r (-a x ± 1r) = -a 1r",
        simp add:val_minus_eq value_of_one,
        simp add:val_t2p)
        apply (simp add:aadd_commute[of "v x" "v (-a x ± 1r)"])
       apply (cut_tac aadd_pos_poss[of "v (-a x ± 1r)" "v x"], simp)
       apply (simp add:val_minus_eq[THEN sym, of v x])
       apply (subst aGroup.ag_pOp_commute, assumption+)
       apply (rule val_axiom4[of v "-a x"], assumption+)
       apply (simp add:aless_imp_le, assumption) *)
 apply (subst value_of_inv[of v "1r ± x r (1r ± -a x)"], assumption+,
        rule aGroup.ag_pOp_closed, assumption+,
               rule Ring.ring_tOp_closed, assumption+,
        frule value_less_eq[THEN sym, of v "1r" "-a x"], assumption+,
        simp add:value_of_one, simp add:val_minus_eq,
        subst value_less_eq[THEN sym, of v "1r" "x r (1r ± -a x)"],
           assumption+, rule Ring.ring_tOp_closed, assumption+,
           simp add:value_of_one, subst val_t2p, assumption+,
           subst aadd_commute,
       rule aadd_pos_poss[of "v (1r ± -a x)" "v x"],
       simp, assumption, simp add:value_of_one,
       simp add:aadd_0_r)
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of K],
       frule Ring.ring_one,
       rule contrapos_pp, simp+,
       frule Ring.ring_tOp_closed[of K x "(1r ± -a x)"], assumption+,
       rule aGroup.ag_pOp_closed, assumption+,
       rule aGroup.ag_mOp_closed, assumption+,
       frule aGroup.ag_mOp_closed[of K x], assumption+)

apply (simp add:aGroup.ag_pOp_commute[of K "1r"],
       frule aGroup.ag_eq_diffzero[THEN sym, of K "x r (-a x ± 1r)" "-a 1r"],
       simp add:aGroup.ag_pOp_commute, 
       rule aGroup.ag_mOp_closed, assumption+,
       simp add:aGroup.ag_inv_inv,
       frule eq_elems_eq_val[of "x r (-a x ± 1r)" "-a 1r" v],
        thin_tac "x r (-a x ± 1r) = -a 1r",
        simp add:val_minus_eq value_of_one,
        frule_tac aGroup.ag_pOp_closed[of K "-a x" "1r"], assumption+,
        simp add:val_t2p)
  apply (simp add:aadd_commute[of "v x"],
         cut_tac aadd_pos_poss[of "v (-a x ± 1r)" "v x"], simp,
         subst aGroup.ag_pOp_commute, assumption+,
         subst value_less_eq[THEN sym, of v "1r" "-a x"], assumption+,
         simp add:value_of_one val_minus_eq, simp add:value_of_one)
   
 apply assumption
done

lemma (in Corps) OstrowskiTr10:"valuation K v; x  carrier K; 
       ¬ 0  v x  0 < (v (x r ((1r ± x r (1r ± -a x))K)))" 
apply (frule OstrowskiTr6[of "v" "x"], assumption+,
       cut_tac invf_closed1[of "1r ± x r (1r ± -a x)"], simp,
       erule conjE, simp add:aneg_le, frule val_neg_nonzero[of "v" "x"], 
       (erule conjE)+, assumption+, erule conjE) 
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule aGroup.ag_mOp_closed[of "K" "x"], assumption+, 
       frule Ring.ring_one[of "K"],
       frule aGroup.ag_pOp_closed[of "K" "1r" "-a x"], assumption+,
       subst val_t2p, assumption+)
apply (subst value_of_inv[of "v" "1r ± x r (1r ± -a x)"],
       assumption+, subst aGroup.ag_pOp_commute[of "K" "1r"], assumption+,
       rule Ring.ring_tOp_closed, assumption+,
       subst value_less_eq[THEN sym, of v 
                                      "x r (1r ± -a x)" "1r"], assumption+)
apply (rule Ring.ring_tOp_closed, assumption+, simp add:value_of_one,
       frule one_plus_x_nonzero[of "v" "-a x"], assumption,
       simp add:val_minus_eq, erule conjE, simp,
       subst val_t2p[of "v"], assumption+, simp add:aadd_two_negg)

apply (simp add:val_t2p,
       frule value_less_eq[THEN sym, of "v" "-a x" "1r"], assumption+,
       simp add:value_of_one, simp add:val_minus_eq,
       simp add:val_minus_eq, simp add:aGroup.ag_pOp_commute[of "K" "-a x"],
       frule val_nonzero_z[of "v" "x"], assumption+, erule exE,
       simp add:a_zpz aminus, simp add:ant_0[THEN sym] aless_zless,
       assumption)
done

lemma (in Corps) Ostrowski_first:"vals_nonequiv K (Suc 0) vv
          xcarrier K. Ostrowski_elem K (Suc 0) vv x"  
 apply (simp add:vals_nonequiv_def,
        cut_tac Nset_Suc0, (erule conjE)+,
        simp add:valuations_def)
 apply (rotate_tac -1, 
        frule_tac a = 0 in forall_spec, simp,
        rotate_tac -1,
        drule_tac a = "Suc 0" in forall_spec, simp)
 apply (drule_tac a = "Suc 0" in forall_spec, simp,
        rotate_tac -1,
        drule_tac a = 0 in forall_spec, simp, simp)
 apply (frule_tac a = 0 in forall_spec, simp,
        drule_tac a = "Suc 0" in forall_spec, simp,
        frule_tac v = "vv 0" and v' = "vv (Suc 0)" in 
         nonequiv_ex_Ostrowski_elem, assumption+,
         erule bexE) 

 apply (erule conjE,
        frule_tac v = "vv (Suc 0)" and v' = "vv 0" in 
        nonequiv_ex_Ostrowski_elem, assumption+,
        erule bexE,
        thin_tac "¬ v_equiv K (vv (Suc 0)) (vv 0)",
        thin_tac "¬ v_equiv K (vv 0) (vv (Suc 0))")

 apply (rename_tac s t) (* we show s and t are non-zero in the following 4
                          lines *) 
 apply (erule conjE,
        frule_tac x = t and v = "vv 0" in val_neg_nonzero, assumption+) 
apply (simp add:less_ant_def, (erule conjE)+,
       frule_tac x = s and v = "vv (Suc 0)" in val_neg_nonzero,
       assumption+, unfold less_ant_def) 
apply (rule conjI, assumption+)  

 apply (frule_tac s = s and t = t and v = "vv 0" in OstrowskiTr2, 
        assumption+, rule ale_neq_less, assumption+)
 apply (frule_tac s = s and t = t and v = "vv (Suc 0)" in OstrowskiTr3,
         assumption+, rule ale_neq_less, assumption+) 
 apply (subgoal_tac "t r (( s ± t)K)  carrier K",
        simp only:Ostrowski_elem_def,
        simp only: nset_m_m[of "Suc 0"], blast) 
       (* Here simp add:nset_m_m[of "Suc 0"] wouldn't work *)
 apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
        rule Ring.ring_tOp_closed, assumption+,
        frule_tac s = s and t = t and v = "vv 0" in OstrowskiTr1, 
        assumption+, rule ale_neq_less, assumption+,
        frule_tac x = s and y = t in aGroup.ag_pOp_closed[of "K"], assumption+)
    apply (cut_tac x = "s ± t" in invf_closed, blast)
    apply assumption     (* in the above two lines, simp wouldn't work *)
done

(** subsection on inequality **)

lemma (in Corps) Ostrowski:"vv. vals_nonequiv K (Suc n) vv  
                        (xcarrier K. Ostrowski_elem K (Suc n) vv x)" 
apply (induct_tac n,
 rule allI, rule impI, simp add:Ostrowski_first)
(** case (Suc n) **)
 apply (rule allI, rule impI,
       frule_tac n = n and vv = vv in restrict_vals_nonequiv1,
       frule_tac n = n and vv = vv in restrict_vals_nonequiv2,
       frule_tac a = "compose {h. h  Suc n} vv (skip 1)" in forall_spec,
        assumption,
       drule_tac a = "compose {h. h  Suc n} vv (skip 2)" in forall_spec,
         assumption+, (erule bexE)+) 
apply (rename_tac n vv s t,
       cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"])
(**  case * * *  **)
 apply (frule_tac x = s and y = t in Ring.ring_tOp_closed[of "K"], assumption+,
        case_tac "0  vv (Suc 0) s  0  vv (Suc (Suc 0)) t",
        frule_tac vv = vv and s = s and t = t in OstrowskiTr5, assumption+) 
 apply blast


 (** case * * * **)
apply (simp, 
       case_tac "0  (vv (Suc 0) s)", simp,
       frule_tac n = "Suc (Suc n)" and m = "Suc (Suc 0)" and vv = vv in 
         vals_nonequiv_valuation,
       simp,
       frule_tac v = "vv (Suc (Suc 0))" and x = t in OstrowskiTr6,
         assumption+,
       frule_tac x = "1r ± t r (1r ± -a t)" in invf_closed1,
       frule_tac x = t and y = "(1r ± t r (1r ± -a t))K" in 
               Ring.ring_tOp_closed, assumption+, simp)
apply (subgoal_tac "Ostrowski_elem K (Suc (Suc n)) vv 
                       (t r ((1r ± t r (1r ± (-a t)))K))",
       blast)
apply (subst Ostrowski_elem_def,
       rule conjI,
       thin_tac "Ostrowski_elem K (Suc n)
         (compose {h. h  Suc n} vv (skip (Suc 0))) s",
       thin_tac "vals_nonequiv K (Suc n)
         (compose {h. h  Suc n} vv (skip (Suc 0)))",
       thin_tac "vals_nonequiv K (Suc n) (compose {h. h Suc n} vv (skip 2))",
       thin_tac "0  (vv (Suc 0) s)",
       frule_tac n = "Suc (Suc n)" and vv = vv and m = 0 in 
                      vals_nonequiv_valuation, simp,
       rule_tac v = "vv 0" and x = t in 
          OstrowskiTr8, assumption+)

apply (simp add:Ostrowski_elem_def, (erule conjE)+,
       thin_tac "jnset (Suc 0) (Suc n).
            0 < (compose {h. h  (Suc n)} vv (skip 2) j t)",
       simp add:compose_def skip_def,
       rule ballI,
       thin_tac "0  (vv (Suc 0) s)",
       thin_tac "Ostrowski_elem K (Suc n) 
                    (compose {h. h  (Suc n)} vv (skip (Suc 0))) s",
       frule_tac n = "Suc (Suc n)" and vv = vv and m = j in 
                     vals_nonequiv_valuation,
       simp add:nset_def, simp add:Ostrowski_elem_def, (erule conjE)+)
 (** case * * * **)
 apply (case_tac "j = Suc 0", simp,
        drule_tac x = "Suc 0" in bspec,
        simp add:nset_def,
        simp add:compose_def skip_def,
        rule_tac v = "vv (Suc 0)" and x = t in 
         OstrowskiTr9, assumption+,
        frule_tac j = j and n = n in nset_Tr51, assumption+,
        drule_tac x = "j - Suc 0" in bspec, assumption+,
        simp add:compose_def skip_def)
 (** case * * * **) 
 apply (case_tac "j = Suc (Suc 0)", simp) apply (
       rule_tac v = "vv (Suc (Suc 0))" and x = t in OstrowskiTr10, 
       assumption+) apply (
       subgoal_tac "¬ j - Suc 0  Suc 0", simp add:nset_def) apply(
       rule_tac v = "vv j" and x = t in 
                    OstrowskiTr9) apply (simp add:nset_def, assumption+) 
apply (simp add:nset_def, (erule conjE)+, rule nset_Tr52, assumption+,
       thin_tac "vals_nonequiv K (Suc n)
         (compose {h. h  (Suc n)} vv (skip (Suc 0)))",
       thin_tac "vals_nonequiv K (Suc n) 
                   (compose {h. h  (Suc n)} vv (skip 2))",
       thin_tac "Ostrowski_elem K (Suc n) 
                   (compose {h. h (Suc n)} vv (skip 2)) t")
 apply (subgoal_tac "s r ((1r ± s r (1r ± -a s))K)  carrier K",
        subgoal_tac "Ostrowski_elem K (Suc (Suc n)) vv 
                            (s r ((1r ± s r (1r ± -a s))K))", blast)
 prefer 2
 apply (frule_tac n = "Suc (Suc n)" and m = "Suc 0" and vv = vv in 
        vals_nonequiv_valuation, simp,
     frule_tac v = "vv (Suc 0)" and x = s in OstrowskiTr6, assumption+,
     rule Ring.ring_tOp_closed, assumption+,
     frule_tac x = "1r ± s r (1r ± -a s)" in invf_closed1, simp,
     simp add:Ostrowski_elem_def)
apply (rule conjI)
apply (rule_tac v = "vv 0" and x = s in OstrowskiTr8,
       simp add:vals_nonequiv_valuation, assumption+) 
       apply (
       thin_tac "vals_nonequiv K (Suc (Suc n)) vv",
       (erule conjE)+,
       thin_tac "jnset (Suc 0) (Suc n).
            0 < (compose {h. h  (Suc n)} vv (skip (Suc 0)) j s)",
       simp add:compose_def skip_def,  rule ballI)
 (** case *** *** **)
 apply (case_tac "j = Suc 0", simp,
     rule_tac v = "vv (Suc 0)" and x = s in OstrowskiTr10,
     simp add:vals_nonequiv_valuation, assumption+,
     rule_tac v = "vv j" and x = s in OstrowskiTr9,
     simp add:vals_nonequiv_valuation nset_def, assumption,
     (erule conjE)+, simp add:compose_def skip_def,
     frule_tac j = j in nset_Tr51, assumption+,
     drule_tac x = "j - Suc 0" in bspec, assumption+)
 apply (simp add:nset_def)
done

lemma (in Corps) val_1_nonzero:"valuation K v; x  carrier K; v x = 1 
                               x  𝟬"
apply (rule contrapos_pp, simp+,
       simp add:value_of_zero,
       rotate_tac 3, drule sym, simp only:ant_1[THEN sym],
       simp del:ant_1)
done

lemma (in Corps) Approximation1_5Tr1:"vals_nonequiv K (Suc n) vv; 
 n_val K (vv 0) = vv 0; a  carrier K; vv 0 a = 1; x  carrier K; 
 Ostrowski_elem K (Suc n) vv x   
        m. 2  m  vv 0 ((1r ± -a x)^K m ± a r (x^K m)) = 1" 
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule Ring.ring_one[of "K"],
       rule allI, rule impI,
       frule vals_nonequiv_valuation[of "Suc n" "vv" "0"],
       simp,
       simp add:Ostrowski_elem_def, frule conjunct1, fold Ostrowski_elem_def,
       frule val_1_nonzero[of "vv 0" "a"], assumption+)
apply (frule vals_nonequiv_valuation[of "Suc n" "vv" "0"], simp,
       frule val_nonzero_noninf[of "vv 0" "a"], assumption+,
       frule val_unit_cond[of "vv 0" "x"], assumption+,
       frule_tac n = m in Ring.npClose[of "K" "x"], assumption+,
       frule aGroup.ag_mOp_closed[of "K" "x"], assumption+,
       frule aGroup.ag_pOp_closed[of "K" "1r" "-a x"], assumption+) 
apply (subgoal_tac "0 < m",
       frule_tac x = "a r (x^K m)" and y = "(1r ± -a x)^K m" in 
       value_less_eq[of "vv 0"],
       rule Ring.ring_tOp_closed, assumption+,
       rule Ring.npClose, assumption+, simp add: val_t2p,
       frule value_zero_nonzero[of "vv 0" "x"], assumption+,
       simp add:val_exp_ring[THEN sym], simp add:asprod_n_0 aadd_0_r) 
apply (case_tac "x = 1rK", simp add:aGroup.ag_r_inv1,
       frule_tac n = m in Ring.npZero_sub[of "K"], simp,
       simp add:value_of_zero) 
apply (cut_tac inf_ge_any[of "1"], simp add: less_le)
apply (rotate_tac -1, drule not_sym,
      frule aGroup.ag_neq_diffnonzero[of "K" "1r" "x"],
      simp add:Ring.ring_one[of "K"], assumption+, simp,
      simp add:val_exp_ring[THEN sym],
      cut_tac n1 = m in of_nat_0_less_iff[THEN sym]) 
apply (cut_tac a = "0 < m" and b = "0 < int m" in a_b_exchange, simp,
       assumption)
apply (thin_tac "(0 < m) = (0 < int m)",
      frule val_nonzero_z[of "vv 0" "1r ± -a x"], assumption+,
      erule exE, simp, simp add:asprod_amult a_z_z,
      simp only:ant_1[THEN sym], simp only:aless_zless, simp add:ge2_zmult_pos)

apply (subst aGroup.ag_pOp_commute[of "K"], assumption+,
       rule Ring.npClose, assumption+, rule Ring.ring_tOp_closed[of "K"], 
       assumption+,
       rotate_tac -1, drule sym, simp,
       thin_tac "vv 0 (a r x^K m ± (1r ± -a x)^K m) = vv 0 (a r x^K m)") 
apply (simp add:val_t2p,
       frule value_zero_nonzero[of "vv 0" "x"], assumption+,
       simp add:val_exp_ring[THEN sym], simp add:asprod_n_0,
       simp add:aadd_0_r,
       cut_tac z = m in less_le_trans[of "0" "2"], simp, assumption+)
done

lemma (in Corps) Approximation1_5Tr3:"vals_nonequiv K (Suc n) vv; 
      x  carrier K; Ostrowski_elem K (Suc n) vv x; j  nset (Suc 0) (Suc n)
          vv j ((1r ± -a x)^K m) = 0"
apply (frule Ostrowski_elem_not_one[of "n" "vv" "x"], assumption+,
       cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule Ring.ring_one[of "K"],
       frule aGroup.ag_pOp_closed[of "K" "1r" "-a x"], assumption+)
apply (simp add:aGroup.ag_mOp_closed, simp add:nset_def,
       frule_tac m = j in vals_nonequiv_valuation[of "Suc n" "vv"],
       simp,
       frule_tac v1 = "vv j" and x1 = "1r ± -a x" and n1 = m in 
        val_exp_ring[THEN sym], assumption+) 

apply (frule_tac v = "vv j" and x = "1r" and  y = "-a x" in 
       value_less_eq, assumption+, simp add:aGroup.ag_mOp_closed) 
 apply(simp add:value_of_one, simp add:val_minus_eq,
       simp add:Ostrowski_elem_def nset_def)
apply (simp add:value_of_one, rotate_tac -1, drule sym,
       simp add:asprod_n_0)
done

lemma (in Corps) Approximation1_5Tr4:"vals_nonequiv K (Suc n) vv; 
     aa  carrier K; x  carrier K;
     Ostrowski_elem K (Suc n) vv x; j  (Suc n) 
     vv j (aa r (x^K m)) = vv j aa + (int m) *a (vv j  x)"
apply (frule Ostrowski_elem_nonzero[of "n" "vv" "x"],
                                          assumption+,
       cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"])
apply (frule_tac m = j in vals_nonequiv_valuation[of "Suc n" "vv"], assumption)
apply (subst val_t2p[of "vv j"], assumption+,
       rule Ring.npClose, assumption+,
       cut_tac field_is_idom,
       frule_tac v1 = "vv j" and x1 = x and n1 = m in 
       val_exp_ring[THEN sym], assumption+, simp)
done

lemma (in Corps) Approximation1_5Tr5:"vals_nonequiv K (Suc n) vv; 
     a  carrier K; a  𝟬; x  carrier K;
     Ostrowski_elem K (Suc n) vv x; j  nset (Suc 0) (Suc n) 
               l. m. l < m  0 < (vv j (a r (x^K m)))"
apply (frule Ostrowski_elem_nonzero[of "n" "vv" "x"], assumption+,
      subgoal_tac "n. vv j (a r (x^K n)) = vv j a + (int n) *a (vv j  x)",
      simp,
      thin_tac "n. vv j (a r x^K n) = vv j a + int n *a vv j x")
prefer 2
apply (rule allI, rule Approximation1_5Tr4[of _ vv a x j],
         assumption+, simp add:nset_def)
apply (frule_tac m = j in vals_nonequiv_valuation[of "Suc n" "vv"], 
       simp add:nset_def,
       frule val_nonzero_z[of "vv j" "a"], assumption+, erule exE,
       simp add:Ostrowski_elem_def,
       frule conjunct2, fold Ostrowski_elem_def,
       drule_tac x = j in bspec, assumption) 
apply (frule Ostrowski_elem_nonzero[of "n" "vv" "x"], assumption+,
       frule val_nonzero_z[of "vv j" "x"], assumption+, erule exE, simp,
       frule_tac a = za and x = z in zmult_pos_bignumTr,
       simp add:asprod_amult a_z_z a_zpz)
done  

lemma (in Corps) Approximation1_5Tr6:"vals_nonequiv K (Suc n) vv; 
      a  carrier K; a  𝟬; x  carrier K;
      Ostrowski_elem K (Suc n) vv x; j  nset (Suc 0) (Suc n) 
        l. m. l < m  vv j ((1r ± -a x)^K m ± a r (x^K m)) = 0" 
apply (frule vals_nonequiv_valuation[of "Suc n" "vv" "j"], 
       simp add:nset_def, 
       frule Approximation1_5Tr5[of "n" "vv" "a" "x" "j"],
               assumption+, erule exE,
       cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       subgoal_tac "m. l < m  vv j ((1r ± -a x)^K m ± a r (x^K m)) = 
       vv j ((1r ± -a x)^K m)")
 apply (simp add:Approximation1_5Tr3, blast)
 apply (rule allI, rule impI, 
        drule_tac a = m in forall_spec, assumption,
        frule_tac x = "(1r ± -a x)^K m" and y = "a r (x^K m)" in 
           value_less_eq[of "vv j"],
        rule Ring.npClose, assumption+,
        rule aGroup.ag_pOp_closed, assumption+, simp add:Ring.ring_one,
        simp add:aGroup.ag_mOp_closed)
 apply (rule Ring.ring_tOp_closed, assumption+,
        rule Ring.npClose, assumption+,
        simp add:Approximation1_5Tr3,
        frule sym, assumption)
done 

lemma (in Corps) Approximation1_5Tr7:"a  carrier K; vv 0 a = 1; 
      x  carrier K  
      vals_nonequiv K (Suc n) vv   Ostrowski_elem K (Suc n) vv x  
      (l. m. l < m  (jnset (Suc 0) (Suc n). 
                (vv j ((1r ± -a x)^K m ± a r (x^K m)) = 0)))"
apply (induct_tac n,
       rule impI, erule conjE, simp add:nset_m_m[of "Suc 0"],
       frule vals_nonequiv_valuation[of "Suc 0" "vv" "Suc 0"], simp,
       frule Approximation1_5Tr6[of "0" "vv" "a" "x" "Suc 0"], assumption+) 
apply (frule vals_nonequiv_valuation[of "Suc 0" "vv" "0"], simp,
       frule val_1_nonzero[of "vv 0" "a"], assumption+, simp add:nset_def,
       assumption)
(** case n **) 
apply (rule impI, erule conjE,
       frule_tac n = n in  restrict_vals_nonequiv[of _ "vv"],
       frule_tac n = n in restrict_Ostrowski_elem[of "x"  _ "vv"],
          assumption, simp,
       erule exE,
       frule_tac n = "Suc n" and j = "Suc (Suc n)" in Approximation1_5Tr6 
        [of _ "vv" "a" "x"], assumption+,
       frule_tac n = "Suc (Suc n)" in vals_nonequiv_valuation[of _ "vv" 
        "0"],simp,
       rule val_1_nonzero[of "vv 0" "a"], assumption+,
       simp add:nset_def)
apply (erule exE,
       subgoal_tac "m. (max l la) < m  (jnset (Suc 0) (Suc (Suc n)).
         vv j ((1r ± -a x)^K m ± a r (x^K m)) = 0)",
       blast,
      simp add:nset_Suc)
done   

lemma (in Corps) Approximation1_5P:"vals_nonequiv K (Suc n) vv; 
    n_val K (vv 0) = vv 0  
    xcarrier K. ((vv 0 x = 1)  (jnset (Suc 0) (Suc n). (vv j x) = 0))"
apply (frule vals_nonequiv_valuation[of "Suc n" "vv" "0"], simp) apply (
       frule n_val_surj[of "vv 0"], erule bexE) apply ( 
       rename_tac aa) apply ( 
       cut_tac n = n in Ostrowski) apply (
       drule_tac a = vv in forall_spec[of "vals_nonequiv K (Suc n)"], simp)
  apply (
       erule bexE,
       frule_tac a = aa and x = x in Approximation1_5Tr1[of "n" "vv"], 
       assumption+,
       simp, assumption+)
apply (frule_tac a = aa and x = x in Approximation1_5Tr7[of _ "vv" _ "n"],
       simp, assumption,
       simp, erule exE,
       cut_tac b = "Suc l" in max.cobounded1[of "2"],
       cut_tac b = "Suc l" in max.cobounded2[of _ "2"],
       cut_tac n = l in lessI,
       frule_tac x = l and y = "Suc l" and z = "max 2 (Suc l)" in 
         less_le_trans, assumption+,
       thin_tac "Suc l  max 2 (Suc l)", thin_tac "l < Suc l",
       drule_tac a = "max 2 (Suc l)" in forall_spec, simp,
       drule_tac a = "max 2 (Suc l)" in forall_spec, assumption) 
 apply (subgoal_tac "(1r ± -a x)^K (max 2 (Suc l)) ± aa r (x^K (max 2 (Suc l)))  
       carrier K",
       blast,
       cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       rule aGroup.ag_pOp_closed, assumption+, rule Ring.npClose, assumption+,
       rule aGroup.ag_pOp_closed, assumption+, simp add:Ring.ring_one,
       simp add:aGroup.ag_mOp_closed, rule Ring.ring_tOp_closed, assumption+,
       rule Ring.npClose, assumption+)
done

lemma K_gamma_hom:"k  n  j  n. (λl. γk l) j  Zset"
apply (simp add:Zset_def) 
done

lemma transpos_eq:"(τ0 0) k = k"
by (simp add:transpos_def)

lemma (in Corps) transpos_vals_nonequiv:"vals_nonequiv K (Suc n) vv; 
      j  (Suc n)  vals_nonequiv K (Suc n) (vv  (τ0 j))"
apply (simp add:vals_nonequiv_def)
 apply (frule conjunct1, fold vals_nonequiv_def)
 apply (simp add:valuations_def, rule conjI)
 apply (rule allI, rule impI) 
 apply (case_tac "ja = 0", simp,
        case_tac "j = 0", simp add:transpos_eq)
 apply (subst transpos_ij_1[of "0" "Suc n" "j"], simp, assumption+,
        rule not_sym, assumption, simp)

 apply (case_tac "ja = j", simp) 
 apply (subst transpos_ij_2[of "0" "Suc n" "j"], simp, assumption, simp,
        simp add:vals_nonequiv_valuation)
 apply (case_tac "j = 0", simp add:transpos_eq) 
 apply (cut_tac x = ja in transpos_id_1[of 0 "Suc n" j], simp, assumption+,
        rule not_sym, assumption+)
 apply (simp add:vals_nonequiv_valuation,
        (rule allI, rule impI)+, rule impI)
 apply (case_tac "j = 0", simp add:transpos_eq,
        simp add:vals_nonequiv_def,
        cut_tac transpos_inj[of "0" "Suc n" "j"], simp) 
 apply (frule_tac x = ja and y = l in injective[of "transpos 0 j" 
                       "{j. j  (Suc n)}"], simp, simp, assumption+)
 apply (cut_tac l = ja in transpos_mem[of "0" "Suc n" "j"], simp, assumption+,
        simp, assumption,
       cut_tac l = l in transpos_mem[of "0" "Suc n" "j"], simp, assumption+,
        simp, assumption) 
 apply (simp add:vals_nonequiv_def,
        simp, assumption, rule not_sym, assumption)
done

definition
  Ostrowski_base :: "[_, nat  'b  ant, nat]  (nat  'b)"
                             ("(Ω⇘_ _ _)" [90,90,91]90) where
  "Ostrowski_base K vv n = (λj{h. h  n}. (SOME x. xcarrier K 
                            (Ostrowski_elem K n (vv  (τ0 j)) x)))"

definition
  App_base :: "[_, nat  'b  ant, nat]  (nat  'b)" where
  "App_base K vv n = (λj{h. h  n}. (SOME x. xcarrier K  (((vv  τ0 j) 0 x 
                      = 1)  (knset (Suc 0) n. ((vv  τ0 j) k x) = 0))))"
  (* Approximation base. *)

lemma (in Corps) Ostrowski_base_hom:"vals_nonequiv K (Suc n) vv  
      Ostrowski_base K vv (Suc n)  {h. h  (Suc n)}  carrier K"
apply (rule Pi_I, rename_tac l,
       simp add:Ostrowski_base_def,
       frule_tac j = l in transpos_vals_nonequiv[of n vv], simp,
       cut_tac Ostrowski[of n]) 
apply (drule_tac a = "vv  τ0 l" in forall_spec, simp,
       rule someI2_ex, blast, simp)
done

lemma (in Corps) Ostrowski_base_mem:"vals_nonequiv K (Suc n) vv  
         j  (Suc n). Ostrowski_base K vv (Suc n) j  carrier K"
by (rule allI, rule impI,
       frule Ostrowski_base_hom[of "n" "vv"],
       simp add:funcset_mem del:Pi_I')

lemma (in Corps)  Ostrowski_base_mem_1:"vals_nonequiv K (Suc n) vv; 
       j  (Suc n)  Ostrowski_base K vv (Suc n) j  carrier K"
by (simp add:Ostrowski_base_mem)

lemma (in Corps) Ostrowski_base_nonzero:"vals_nonequiv K (Suc n) vv; 
       j  Suc n   (ΩK vv (Suc n)) j  𝟬"
apply (simp add:Ostrowski_base_def,
       frule_tac j = j in transpos_vals_nonequiv[of "n" "vv"],
                      assumption+,
       cut_tac Ostrowski[of "n"],
       drule_tac a = "vv  τ0 j" in forall_spec, assumption,
       rule someI2_ex, blast) 
apply (thin_tac "xcarrier K. Ostrowski_elem K (Suc n) (vv  τ0 j) x",
       erule conjE)
apply (rule_tac vv = "vv  τ0 j" and x = x in Ostrowski_elem_nonzero[of "n"],
       assumption+)
done

lemma (in Corps) Ostrowski_base_pos:"vals_nonequiv K (Suc n) vv; 
      j  Suc n; ja  Suc n; ja  j  0 < ((vv j) ((ΩK vv (Suc n)) ja))"
apply (simp add:Ostrowski_base_def,
       frule_tac j = ja in transpos_vals_nonequiv[of "n" "vv"],
       assumption+,
       cut_tac Ostrowski[of "n"],
       drule_tac a = "vv  τ0 ja" in forall_spec, assumption+) 
apply (rule someI2_ex, blast,
       thin_tac "xcarrier K. Ostrowski_elem K (Suc n) (vv  τ0 ja) x",
       simp add:Ostrowski_elem_def, (erule conjE)+)
apply (case_tac "ja = 0", simp, cut_tac transpos_eq[of "j"],
       simp add:nset_def, frule Suc_leI[of "0" "j"],
       frule_tac a = j in forall_spec, simp, simp)
apply (case_tac "j = 0", simp,
       frule_tac x = ja in bspec, simp add:nset_def,
       cut_tac  transpos_ij_2[of "0" "Suc n" "ja"], simp, simp+) 
apply (frule_tac x = j in bspec, simp add:nset_def,
       cut_tac transpos_id[of "0" "Suc n" "ja" "j"], simp+) 
done

lemma (in Corps) App_base_hom:"vals_nonequiv K (Suc n) vv; 
      j  (Suc n). n_val K (vv j) = vv j 
        j  (Suc n). App_base K vv (Suc n) j  carrier K"
apply (rule allI, rule impI,
       rename_tac k,
       subst App_base_def)
 apply (case_tac "k = 0", simp, simp add:transpos_eq,
        frule Approximation1_5P[of "n" "vv"], simp,
        rule someI2_ex, blast, simp)
 apply (frule_tac j = k in transpos_vals_nonequiv[of "n" "vv"],
                 simp add:nset_def,
        frule_tac vv = "vv  τ0 k" in Approximation1_5P[of "n"])
 apply (simp add:cmp_def, subst transpos_ij_1[of "0" "Suc n"], simp+,
        subst transpos_ij_1[of 0 "Suc n" k], simp+)
 apply (rule someI2_ex, blast, simp)
done

lemma (in Corps) Approzimation1_5P2:"vals_nonequiv K (Suc n) vv;
           l{h. h  Suc n}. n_val K (vv l) = vv l; i  Suc n; j  Suc n
           vv i (App_base K vv (Suc n) j) = δi j "
apply (simp add:App_base_def) 
apply (case_tac "j = 0", simp add:transpos_eq,
       rule someI2_ex,
       frule Approximation1_5P[of "n" "vv"], simp , blast,
       simp add:Kronecker_delta_def, rule impI, (erule conjE)+,
       frule_tac x = i in bspec, simp add:nset_def, assumption) 

apply (frule_tac j = j in transpos_vals_nonequiv[of "n" "vv"], simp,
       frule Approximation1_5P[of "n" "vv  τ0 j"],
       simp add:cmp_def, simp add:transpos_ij_1[of 0 "Suc n" j])
       
apply (simp add:cmp_def,
         case_tac "i = 0", simp add:transpos_eq,
         simp add:transpos_ij_1, simp add:Kronecker_delta_def,
         rule someI2_ex, blast,
         thin_tac "xcarrier K.
            vv j x = 1  (janset (Suc 0) (Suc n). vv ((τ0 j) ja) x = 0)",
        (erule conjE)+,
         drule_tac x = j in bspec, simp add:nset_def,
         simp add:transpos_ij_2)

apply (simp add:Kronecker_delta_def,
       case_tac "i = j", simp add:transpos_ij_1, rule someI2_ex, blast, simp)

apply (simp, rule someI2_ex, blast,
       thin_tac "xcarrier K. vv ((τ0 j) 0) x = 1  
                     (janset (Suc 0) (Suc n). vv ((τ0 j) ja) x = 0)",
       (erule conjE)+,
       drule_tac x = i in bspec, simp add:nset_def,
       cut_tac transpos_id[of 0 "Suc n" j i], simp+)
done

(*
lemma (in Corps) Approximation1_5:"⟦vals_nonequiv K (Suc n) vv; 
  ∀j ≤ (Suc n)}. n_val K (vv j) = vv j⟧ ⟹
  ∃x∈{h. h ≤ (Suc n)} → carrier K. ∀i ≤ (Suc n). ∀j ≤ (Suc n). 
                              ((vv i)  (x j) = δi j)" *)

lemma (in Corps) Approximation1_5:"vals_nonequiv K (Suc n) vv;
  j  (Suc n). n_val K (vv j) = vv j 
  x. (j  (Suc n). x j  carrier K)  (i  (Suc n). j  (Suc n). 
                              ((vv i)  (x j) = δi j))" 
apply (frule App_base_hom[of n vv], rule allI, simp)
 apply (subgoal_tac "(i  (Suc n). j  (Suc n). 
                 (vv i) ((App_base K vv (Suc n)) j)  = (δi j))",
        blast) 
 apply (rule allI, rule impI)+ 
 apply (rule Approzimation1_5P2, assumption+, simp+) 
done

lemma (in Corps) Ostrowski_baseTr0:"vals_nonequiv K (Suc n) vv; l  (Suc n) 
      0 < ((vv l) (1r ± -a (Ostrowski_base K vv (Suc n) l))) 
  (m{h. h  (Suc n)} - {l}. 0 < ((vv m) (Ostrowski_base K vv (Suc n) l)))"
apply (simp add:Ostrowski_base_def,
       frule_tac j = l in transpos_vals_nonequiv[of "n" "vv"], assumption,
       cut_tac Ostrowski[of "n"],
       drule_tac a = "vv  τ0 l" in forall_spec, assumption) 
apply (erule bexE,
       unfold Ostrowski_elem_def, frule conjunct1,
       fold Ostrowski_elem_def, 
       rule conjI, simp add:Ostrowski_elem_def)
apply (case_tac "l = 0", simp, simp add:transpos_eq,
       rule someI2_ex, blast, simp,
       simp add:transpos_ij_1,
       rule someI2_ex, blast, simp)

apply (simp add:Ostrowski_elem_def,
       case_tac "l = 0", simp, simp add:transpos_eq,
       rule someI2_ex, blast,
       thin_tac "0 < vv 0 (1r ± -a x)  
                      (jnset (Suc 0) (Suc n). 0 < vv j x)",
       rule ballI, simp add:nset_def) 

apply (rule ballI, erule conjE,
       rule someI2_ex, blast,
       thin_tac "jnset (Suc 0) (Suc n). 0 < vv ((τ0 l) j) x",
       (erule conjE)+)

apply (case_tac "m = 0", simp,
       drule_tac x = l in bspec, simp add:nset_def,
       simp add:transpos_ij_2,
       drule_tac x = m in bspec, simp add:nset_def,
       simp add:transpos_id)
done  

lemma (in Corps) Ostrowski_baseTr1:"vals_nonequiv K (Suc n) vv; l  (Suc n)
      0 < ((vv l) (1r ± -a (Ostrowski_base K vv (Suc n) l)))"
by (simp add:Ostrowski_baseTr0)

lemma (in Corps) Ostrowski_baseTr2:"vals_nonequiv K (Suc n) vv; 
        l  (Suc n); m  (Suc n); l  m 
        0 < ((vv m) (Ostrowski_base K vv (Suc n) l))"   
apply (frule Ostrowski_baseTr0[of "n" "vv" "l"], assumption+) 
apply simp
done

lemma Nset_have_two:"j {h. h  (Suc n)}  m  {h. h  (Suc n)}. j  m"
apply (rule contrapos_pp, simp+,
       case_tac "j = Suc n", simp,
       drule_tac a = 0 in forall_spec, simp, arith) 
 apply (drule_tac a = "Suc n" in forall_spec, simp, simp)
done  

lemma (in Corps) Ostrowski_base_npow_not_one:"0 < N; j  Suc n;
       vals_nonequiv K (Suc n) vv    
                              1r ± -a ((ΩK vv (Suc n)) j^K N)  𝟬"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       rule contrapos_pp, simp+,
       frule Ostrowski_base_mem_1[of "n" "vv" "j"], assumption,
       frule Ring.npClose[of "K" "(ΩK vv (Suc n)) j" "N"], assumption+,
       frule Ring.ring_one[of "K"],
       frule aGroup.ag_mOp_closed[of K "(ΩK vv (Suc n)) j^K N"], assumption+,
       frule aGroup.ag_pOp_closed[of "K" "1r" "-a ((ΩK  vv (Suc n)) j^K N)"],
       assumption+) 
apply (frule  aGroup.ag_pOp_add_r[of "K" "1r ± -a ((ΩK vv (Suc n)) j^K N)" "𝟬" 
           "(ΩK  vv  (Suc n)) j^K N"], assumption+,
        simp add:aGroup.ag_inc_zero, assumption+, 
        thin_tac "1r ± -a ((ΩK vv (Suc n)) j^K N) = 𝟬")
 apply (simp add:aGroup.ag_pOp_assoc[of "K" "1r" "-a ((ΩK vv (Suc n)) j^K N)"])
 apply (simp add:aGroup.ag_l_inv1, simp add:aGroup.ag_r_zero aGroup.ag_l_zero)
  apply (subgoal_tac "m  (Suc n). (j  m  
                                 0 < (vv m ((ΩK vv (Suc n)) j)))") 
 apply (cut_tac Nset_have_two[of "j" "n"],
        erule bexE, drule_tac a = m in forall_spec, simp,
       thin_tac "(ΩK vv (Suc n)) j^K N ± -a ((ΩK vv (Suc n)) j^K N)  carrier K",
       frule_tac f = "vv m" in eq_elems_eq_val[of "1r" "(ΩK vv (Suc n)) j^K N"],
       thin_tac "1r = (ΩK vv (Suc n)) j^K N", simp)
 apply (frule_tac m = m in vals_nonequiv_valuation[of "Suc n" "vv"],
        assumption+, 
        frule_tac v1 = "vv m" and n1 = N in val_exp_ring[THEN sym, 
         of  _ "(ΩK vv (Suc n)) j"], assumption+,
        simp add:Ostrowski_base_nonzero, simp, simp add:value_of_one)
 apply (subgoal_tac "int N  0",
        frule_tac x = "vv m ((ΩK vv (Suc n)) j)" in asprod_0[of "int N"],
        assumption, simp add:less_ant_def, simp, simp,
        rule allI, rule impI, rule impI,
        rule Ostrowski_baseTr2, assumption+)
done

abbreviation
  CHOOSE :: "[nat, nat]  nat"  ("(_⇙C⇘_)" [80, 81]80) where
  "nCi == n choose i"

lemma (in Ring) expansion_of_sum1:"x  carrier R  
                (1r ± x)^R n = nsum R (λi. nCi ×R x^R i) n"
apply (cut_tac ring_one, frule npeSum2[of "1r" "x" "n"], assumption+,
       simp add:npOne, subgoal_tac "(j::nat). (x^R j)  carrier R")
apply (simp add:ring_l_one, rule allI, simp add:npClose)
done 

lemma (in Ring) tail_of_expansion:"x  carrier R  (1r ± x)^R (Suc n) = 
             (nsum R (λ i. ((Suc n)C(Suc i) ×R x^R (Suc i))) n) ± 1r"
apply (cut_tac ring_is_ag)
apply (frule expansion_of_sum1[of "x" "Suc n"],
       simp del:nsum_suc binomial_Suc_Suc npow_suc,
       thin_tac "(1r ± x)^R (Suc n) = Σe R (λi. (Suc n)Ci ×R x^R i) (Suc n)")
apply (subst aGroup.nsumTail[of R n "λi. (Suc n)Ci ×R x^R i"], assumption,
       rule allI, rule impI, rule nsClose, rule npClose, assumption)
apply (cut_tac ring_one,
       simp del:nsum_suc binomial_Suc_Suc npow_suc add:aGroup.ag_l_zero) 
done

lemma (in Ring) tail_of_expansion1:"x  carrier R 
  (1r ± x)^R (Suc n)  = x r (nsum R (λ i. ((Suc n)C(Suc i) ×R x^R i)) n) ± 1r"
apply (frule tail_of_expansion[of "x" "n"], 
       simp del:nsum_suc binomial_Suc_Suc npow_suc,
       subgoal_tac "i.  Suc nCSuc i ×R x^R i  carrier R",
       cut_tac ring_one, cut_tac ring_is_ag)
prefer 2  apply(simp add: nsClose npClose)
apply (rule aGroup.ag_pOp_add_r[of "R" _ _ "1r"], assumption+,
       rule aGroup.nsum_mem, assumption+, rule allI, rule impI,
       rule nsClose, rule npClose, assumption)
apply (rule ring_tOp_closed, assumption+,
       rule aGroup.nsum_mem, assumption+, blast, simp add:ring_one)
apply (subst nsumMulEleL[of "λi. Suc nCSuc i ×R x^R i" "x"], assumption+)
apply (rule aGroup.nsum_eq, assumption, rule allI, rule impI, rule nsClose,
       rule npClose, assumption, rule allI, rule impI,
       rule ring_tOp_closed, assumption+, rule nsClose, rule npClose,
       assumption) 
apply (rule allI, rule impI)
apply (subst nsMulDistrL, assumption, simp add:npClose, 
       frule_tac n = j in npClose[of x], simp add:ring_tOp_commute[of x])
done 

lemma (in Corps) nsum_in_VrTr:"valuation K v  
       (j  n. f j  carrier K)  (j  n. 
       0  (v (f j)))  (nsum K f n)  carrier (Vr K v)"
apply (induct_tac n)
 apply (rule impI, erule conjE, simp add:val_pos_mem_Vr)
apply (rule impI, erule conjE)
apply (frule Vr_ring[of v], frule Ring.ring_is_ag[of "Vr K v"],
       frule_tac  x = "f (Suc n)" and y = "nsum K f n" in 
         aGroup.ag_pOp_closed[of "Vr K v"],
       subst val_pos_mem_Vr[THEN sym, of  "v"], assumption+,
       simp, simp, simp) 
apply (simp, subst Vr_pOp_f_pOp[of "v", THEN sym], assumption+,
       subst val_pos_mem_Vr[THEN sym, of v], assumption+,
       simp+)
apply (subst aGroup.ag_pOp_commute, assumption+, simp add:val_pos_mem_Vr,
       assumption)
done

lemma (in Corps) nsum_in_Vr:"valuation K v; j  n. f j  carrier K; 
       j  n.  0  (v (f j))  (nsum K f n)  carrier (Vr K v)"
apply (simp add:nsum_in_VrTr)
done

lemma (in Corps) nsum_mem_in_Vr:"valuation K v; 
       j  n. (f j)  carrier K; j  n. 0  (v (f j)) 
         (nsum K f n)  carrier (Vr K v)"
by (rule nsum_in_Vr)

lemma (in Corps) val_nscal_ge_selfTr:"valuation K v; x  carrier K; 0  v x
         v x   v (n ×K x)"
apply (cut_tac field_is_ring, induct_tac n, simp)  
apply (simp add:value_of_zero,
       simp,
       frule_tac y = "n ×K x" in amin_le_plus[of "v" "x"], assumption+,
       rule Ring.nsClose, assumption+) 
apply (simp add:amin_def,
       frule Ring.ring_is_ag[of K],
       frule_tac n = n in Ring.nsClose[of K x], assumption+,
       simp add:aGroup.ag_pOp_commute)
done

lemma (in Corps) ApproximationTr:"valuation K v; x  carrier K; 0  (v x) 
             v x  (v (1r ± -a ((1r ± x)^K (Suc n))))"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       case_tac "x = 𝟬K",
       simp, frule Ring.ring_one[of "K"], simp add:aGroup.ag_r_zero,
       simp add:Ring.npOne, simp add:Ring.ring_l_one,simp add:aGroup.ag_r_inv1,
       subst Ring.tail_of_expansion1[of "K" "x"], assumption+, 
       frule Ring.ring_one[of "K"])
apply (subgoal_tac "(nsum K (λi. Suc nCSuc i ×K x^K i) n)carrier (Vr K v)",
       frule Vr_mem_f_mem[of "v" "(nsum K (λi. Suc nCSuc i ×K x^K i) n)"],
       assumption+,
       frule_tac x = x and y = "nsum K (λi. Suc nCSuc i ×K x^K i) n" in 
       Ring.ring_tOp_closed[of "K"], assumption+,
       subst aGroup.ag_pOp_commute[of "K" _ "1r"], assumption+,
       subst aGroup.ag_p_inv[of "K" "1r"], assumption+,
       subst aGroup.ag_pOp_assoc[THEN sym], assumption+,
       simp add:aGroup.ag_mOp_closed, rule aGroup.ag_mOp_closed, assumption+,
       simp del:binomial_Suc_Suc add:aGroup.ag_r_inv1, subst aGroup.ag_l_zero,
       assumption+,
       rule aGroup.ag_mOp_closed, assumption+, simp add:val_minus_eq)

apply (subst val_t2p[of v], assumption+) apply (
       simp add:val_pos_mem_Vr[THEN sym, of v 
                  "nsum K (λi.(nCi + nCSuc i) ×K x^K i) n"],
       frule aadd_le_mono[of "0" "v (nsum K (λi.(nCi + nCSuc i) ×K x^K i) n)" 
         "v x"], simp add:aadd_0_l, simp add:aadd_commute[of "v x"])

apply (rule nsum_mem_in_Vr[of v n "λi.Suc nCSuc i ×K x^K i"], assumption, 
       rule allI, rule impI) apply (rule Ring.nsClose, assumption+) apply (simp add:Ring.npClose)

apply (rule allI, rule impI)
apply (cut_tac i = 0 and j = "v (x^K j)" and k = "v (Suc nCSuc j ×K x^K j)"
       in ale_trans)
 apply (case_tac "j = 0", simp add:value_of_one)
 apply (simp add: val_exp_ring[THEN sym],
        frule val_nonzero_z[of v x], assumption+,
        erule exE,
        cut_tac m1 = 0 and n1 = j in of_nat_less_iff[THEN sym],
        frule_tac a = "0 < j" and b = "int 0 < int j" in a_b_exchange,
        assumption, thin_tac "0 < j", thin_tac "(0 < j) = (int 0 < int j)")
apply (simp del: of_nat_0_less_iff)

apply (frule_tac w1 = "int j" and x1 = 0 and y1 = "ant z" in 
         asprod_pos_mono[THEN sym],
        simp only:asprod_n_0) 

 apply(rule_tac x = "x^K j" and n = "Suc nCSuc j" in 
       val_nscal_ge_selfTr[of v], assumption+,
       simp add:Ring.npClose, simp add:val_exp_ring[THEN sym],
       frule val_nonzero_z[of "v" "x"], assumption+, erule exE, simp)
 apply (case_tac "j = 0", simp)
 apply (subst asprod_amult, simp, simp add:a_z_z)
apply(
        simp only:ant_0[THEN sym], simp only:ale_zle,
        cut_tac m1 = 0 and n1 = j in of_nat_less_iff[THEN sym])
apply (        frule_tac a = "0 < j" and b = "int 0 < int j" in a_b_exchange, 
        assumption+, thin_tac "0 < j", thin_tac "(0 < j) = (int 0 < int j)",
        frule_tac z = "int 0" and z' = "int j" in zless_imp_zle,
        frule_tac i = "int 0" and j = "int j" and k = z in int_mult_le,
         assumption+, simp add:mult.commute )
 apply assumption
done

lemma (in Corps) ApproximationTr0:"aa  carrier K 
            (1r ± -a (aa^K N))^K N  carrier K"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       rule Ring.npClose, assumption+, 
       rule aGroup.ag_pOp_closed, assumption+, simp add:Ring.ring_one,
       rule aGroup.ag_mOp_closed, assumption+, rule Ring.npClose, assumption+)
done

lemma (in Corps) ApproximationTr1:"aa  carrier K 
            1r ± -a ((1r ± -a (aa^K N))^K N)  carrier K"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule ApproximationTr0[of aa N],
       frule Ring.ring_one[of "K"], rule aGroup.ag_pOp_closed, assumption+,
       rule aGroup.ag_mOp_closed, assumption+)
done

lemma (in Corps) ApproximationTr2:"valuation K v; aa  carrier K; aa  𝟬; 
     0  (v aa)  (int N) *a(v aa)  (v (1r ± -a ((1r ± -a (aa^K N))^K N)))"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       case_tac "N = 0",
       frule val_nonzero_z[of v "aa"], assumption+, erule exE, simp) 
 apply(frule Ring.ring_one[of "K"], simp add:aGroup.ag_r_inv1,
       simp add:value_of_zero)

apply (frule_tac n = N in Ring.npClose[of "K" "aa"], assumption+,
       frule ApproximationTr[of v "-a (aa^K N)" "N - Suc 0"],
       rule aGroup.ag_mOp_closed, assumption+, simp add:val_minus_eq,
       subst val_exp_ring[THEN sym, of v], assumption+,
       simp add:asprod_pos_pos)
apply (simp add:val_minus_eq, simp add:val_exp_ring[THEN sym])
done

lemma (in Corps) eSum_tr:"
( j  n. (x j)  carrier K)  
 ( j  n. (b j)  carrier K)  l  n  
 ( j({h. h  n} -{l}). (g j = (x j) r (1r ± -a (b j))))  
  g l = (x l) r (-a (b l))
 (nsum K (λj  {h. h  n}. (x j) r (1r ± -a (b j))) n) ± (-a (x l)) = 
                       nsum K g n"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"])
apply (induct_tac n)
 apply (simp, rule impI, (erule conjE)+, 
       simp, frule Ring.ring_one[of "K"], subst Ring.ring_distrib1, 
       assumption+,
       simp add:aGroup.ag_mOp_closed, simp add:Ring.ring_r_one,
       frule aGroup.ag_mOp_closed[of K "b 0"], assumption+,
       frule Ring.ring_tOp_closed[of "K" "x 0" "-a (b 0)"], assumption+,
       subst aGroup.ag_pOp_commute[of "K" "x 0" _], assumption+,
       subst aGroup.ag_pOp_assoc, assumption+, 
       frule aGroup.ag_mOp_closed[of "K"], 
       assumption+) 
 apply (simp add:aGroup.ag_r_inv1, subst aGroup.ag_r_zero, assumption+, simp)
apply (rule impI, (erule conjE)+)
 apply (subgoal_tac "j  (Suc n).  ((x j) r (1r ± -a (b j)))  carrier K")
apply (case_tac "l = Suc n", simp)
 apply (subgoal_tac "Σe K g n  carrier K",
        subgoal_tac "{h. h  (Suc n)} - {Suc n} = {h. h  n}", simp,
        subgoal_tac "j. j  n  j  (Suc n)",
        frule_tac f = "λu. if u  Suc n then (x u) r (1r ± -a (b u)) else 
        undefined" and n = n in aGroup.nsum_eq[of "K" _ _ "g"])
 apply (rule allI, rule impI, simp,
        rule allI, simp, rule allI, rule impI, simp, simp)

 apply (cut_tac a = "x (Suc n) r (1r ± -a (b (Suc n))) ± -a (x (Suc n))" and 
       b = "x (Suc n) r (-a (b (Suc n)))" and 
       c = "Σe K g n" in aGroup.ag_pOp_add_l[of K], assumption)
 apply (rule aGroup.ag_pOp_closed, assumption+,
        rule Ring.ring_tOp_closed, assumption+, simp,
        rule aGroup.ag_pOp_closed, assumption+, simp add:Ring.ring_one,
        rule aGroup.ag_mOp_closed, assumption, simp,
        rule aGroup.ag_mOp_closed, assumption, simp,
        rule Ring.ring_tOp_closed, assumption+, simp,
        rule aGroup.ag_mOp_closed, assumption+, simp, assumption)

 apply (subst Ring.ring_distrib1, assumption+, simp, simp add:Ring.ring_one,
        simp add:aGroup.ag_mOp_closed,
        simp add:Ring.ring_r_one) apply (
        frule_tac x = "x (Suc n)" and y = "x (Suc n) r (-a (b (Suc n)))" in
        aGroup.ag_pOp_commute [of "K"], simp,
        simp add:Ring.ring_tOp_closed aGroup.ag_mOp_closed,
        simp) apply (
        subst aGroup.ag_pOp_assoc[of "K"], assumption+,
        rule Ring.ring_tOp_closed, assumption+, simp, 
        (simp add:aGroup.ag_mOp_closed)+,
        subst aGroup.ag_r_inv1, assumption+, simp,
        subst aGroup.ag_r_zero, assumption+,
        simp add:Ring.ring_tOp_closed aGroup.ag_mOp_closed, simp,
        rotate_tac -1, drule sym, simp) apply (
        thin_tac "Σe K g n ± x (Suc n) r (-a (b (Suc n))) =
         Σe K g n ± (x (Suc n) r (1r ± -a (b (Suc n))) ± -a (x (Suc n)))")
   apply (subst aGroup.ag_pOp_assoc[THEN sym], assumption+,
          rule Ring.ring_tOp_closed, assumption+, simp, 
          rule aGroup.ag_pOp_closed, assumption+, simp add:Ring.ring_one,
          rule aGroup.ag_mOp_closed, assumption+, simp,
          rule aGroup.ag_mOp_closed, assumption+, simp, simp,
          simp, rule equalityI, rule subsetI, simp, rule subsetI, simp)
  apply (rule aGroup.nsum_mem, assumption+,
         rule allI, rule impI, simp)
defer
  apply (rule allI, rule impI)
  apply (case_tac "j = l", simp,
         rule Ring.ring_tOp_closed, assumption, simp,
         rule aGroup.ag_pOp_closed, assumption+, simp add:Ring.ring_one,
         rule aGroup.ag_mOp_closed, assumption, simp, simp,
         rule Ring.ring_tOp_closed, assumption, simp,
         rule aGroup.ag_pOp_closed, assumption+, simp add:Ring.ring_one,
         rule aGroup.ag_mOp_closed, assumption, simp, simp) (* end defer *)

 apply (subst aGroup.ag_pOp_assoc, assumption+,
        rule aGroup.nsum_mem, assumption+,
        rule allI, simp, rule Ring.ring_tOp_closed, assumption+, simp,
        rule aGroup.ag_pOp_closed, assumption+, simp add:Ring.ring_one,
        rule aGroup.ag_mOp_closed, assumption, simp,
        rule aGroup.ag_mOp_closed, assumption, simp,
        subst aGroup.ag_pOp_commute[of K _ "-a (x l)"], assumption+,
        rule Ring.ring_tOp_closed, assumption, simp,
        rule aGroup.ag_pOp_closed, assumption+, simp add:Ring.ring_one)
 apply (rule aGroup.ag_mOp_closed, assumption+, simp,
        rule aGroup.ag_mOp_closed, assumption+, simp,
        subst aGroup.ag_pOp_assoc[THEN sym], assumption+,
        rule aGroup.nsum_mem, assumption+,
        rule allI, rule impI, simp,
        rule aGroup.ag_mOp_closed, assumption, simp, 
        rule Ring.ring_tOp_closed, assumption, simp,
         rule aGroup.ag_pOp_closed, assumption+, simp add:Ring.ring_one,
         rule aGroup.ag_mOp_closed, assumption, simp)
  apply (subgoal_tac "Σe K (λa. if a  (Suc n) then x a r (1r ± -a (b a)) 
         else undefined) n ± -a (x l) = 
         Σe K (λa. if a  n then x a r (1r ± -a (b a)) else undefined) n ±
         -a (x l)", simp,
         rule aGroup.ag_pOp_add_r[of K _ _ "-a (x l)"], assumption+,
         rule aGroup.nsum_mem, assumption+,
         rule allI, rule impI, simp, 
         rule aGroup.nsum_mem, assumption+,
         rule allI, rule impI, simp,
         rule aGroup.ag_mOp_closed, assumption, simp,
         rule aGroup.nsum_eq, assumption+,
         rule allI, rule impI, simp, rule allI, rule impI) 
   apply simp
   apply (rule allI, rule impI, simp) 
done

lemma (in Corps) eSum_minus_x:"j  n. (x j)  carrier K; 
       j  n. (b j)  carrier K; l  n; 
       j({h. h  n} -{l}). (g j = (x j) r (1r ± -a (b j))); 
       g l = (x l) r (-a (b l))  
       (nsum K (λj{h. h  n}. (x j) r (1r ± -a (b j))) n) ± (-a (x l)) = 
                        nsum K g n"
by (cut_tac eSum_tr[of "n" "x" "b" "l" "g"], simp) 

lemma (in Ring) one_m_x_times:"x  carrier R 
 (1r ± -a x) r (nsum R (λj. x^R j) n) = 1r ± -a (x^R (Suc n))"
apply (cut_tac ring_one, cut_tac ring_is_ag,
       frule aGroup.ag_mOp_closed[of "R" "x"], assumption+,
       frule aGroup.ag_pOp_closed[of "R" "1r" "-a x"], assumption+)

apply (induct_tac n)
 apply (simp add:ring_r_one ring_l_one)
 apply (simp del:npow_suc,
        frule_tac n = "Suc n" in npClose[of "x"],
        subst ring_distrib1, assumption+)
 apply (rule aGroup.nsum_mem, assumption, rule allI, rule impI,
        simp add:npClose, rule npClose, assumption+,
        simp del:npow_suc,
        thin_tac "(1r ± -a x) r Σe R (npow R x) n = 1r ± -a (x^R (Suc n))")
 apply (subst ring_distrib2, assumption+,
        simp del:npow_suc add:ring_l_one,
        subst aGroup.pOp_assocTr43[of R], assumption+,
        rule_tac x = "x^R (Suc n)" in aGroup.ag_mOp_closed[of R], assumption+,
        rule ring_tOp_closed, rule aGroup.ag_mOp_closed, assumption+)
 apply (subst aGroup.ag_l_inv1, assumption+, simp del:npow_suc 
        add:aGroup.ag_r_zero,
        frule_tac x = "-a x" and y = "x^R (Suc n)" in ring_tOp_closed,
        assumption+)
 apply (rule aGroup.ag_pOp_add_l[of R _ _ "1r"], assumption+,
        rule aGroup.ag_mOp_closed, assumption+,
        rule npClose, assumption+,
        subst ring_inv1_1[THEN sym, of x], assumption,
        rule npClose, assumption,
        simp,
        subst ring_tOp_commute[of x], assumption+, simp)
done

lemma (in Corps) x_pow_fSum_in_Vr:"valuation K v; x  carrier (Vr K v) 
   (nsum K (npow K x) n)  carrier (Vr K v)" 
apply (frule Vr_ring[of v])
apply (induct_tac n)
 apply simp
 apply (frule Ring.ring_one[of "Vr K v"])
 apply (simp add:Vr_1_f_1)
apply (simp del:npow_suc)
 apply (frule Ring.ring_is_ag[of "Vr K v"])

 apply (subst Vr_pOp_f_pOp[THEN sym, of v], assumption+)
 apply (subst Vr_exp_f_exp[THEN sym, of v], assumption+)
 apply (rule Ring.npClose[of "Vr K v"], assumption+)
 apply (rule aGroup.ag_pOp_closed[of "Vr K v"], assumption+)
 apply (subst Vr_exp_f_exp[THEN sym, of v], assumption+)
 apply (rule Ring.npClose[of "Vr K v"], assumption+)
done

lemma (in Corps) val_1mx_pos:"valuation K v; x  carrier K; 
         0 < (v (1r ± -a x))   v x = 0"
apply (cut_tac field_is_ring, frule Ring.ring_one[of "K"], 
       frule Ring.ring_is_ag[of "K"])
 apply (frule aGroup.ag_mOp_closed[of "K" "x"], assumption+)
 apply (frule aGroup.ag_pOp_closed[of "K" "1r" "-a x"], assumption+)
 apply (frule aGroup.ag_mOp_closed[of "K" "1r ± -a x"], assumption+)
 apply (cut_tac x = x and y = "1r ± -a (1r ± -a x)" and f = v in 
        eq_elems_eq_val)
apply (subst aGroup.ag_p_inv, assumption+,
       subst aGroup.ag_pOp_assoc[THEN sym], assumption+,
       rule aGroup.ag_mOp_closed, assumption+,
       subst aGroup.ag_inv_inv, assumption+,
       subst aGroup.ag_r_inv1, assumption+,
       subst aGroup.ag_l_zero, assumption+,
       (simp add:aGroup.ag_inv_inv)+,
       frule  value_less_eq[of v  "1r" "-a (1r ± -a x)"],
        assumption+)
 apply (simp add:val_minus_eq value_of_one,
        simp add:value_of_one)
done 

lemma (in Corps) val_1mx_pow:"valuation K v; x  carrier K; 
       0 < (v (1r ± -a x))  0 < (v (1r ± -a x^K (Suc n)))"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"])
apply (subst Ring.one_m_x_times[THEN sym, of K x n], assumption+)
 apply (frule Ring.ring_one[of "K"],
        frule x_pow_fSum_in_Vr[of v x n],
        subst val_pos_mem_Vr[THEN sym], assumption+,
        frule val_1mx_pos[of "v" "x"], assumption+,
        simp)

 apply (subst val_t2p, assumption+,
        rule aGroup.ag_pOp_closed, assumption+,
        simp add:aGroup.ag_mOp_closed, simp add:Vr_mem_f_mem,
        frule val_pos_mem_Vr[THEN sym, of v "nsum K (npow K x) n"],
        simp add:Vr_mem_f_mem, simp)
 apply(frule aadd_le_mono[of "0" "v (nsum K (npow K x) n)" "v (1r ± -a x)"],
       simp add:aadd_0_l, simp add:aadd_commute)
done

lemma (in Corps) ApproximationTr3:"vals_nonequiv K (Suc n) vv; 
      l  (Suc n). x l  carrier K; j  (Suc n)  
     L.(N. L < N  (an m)  (vv j ((Σe K (λk{h. h  (Suc n)}. 
        (x k) r (1r ± -a ((1r ± -a (((ΩK vv (Suc n)) k)^K N))^K N))) 
        (Suc n)) ± -a (x j))))"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"])
 apply (frule_tac vals_nonequiv_valuation[of "Suc n" "vv" j], assumption+) 
apply (subgoal_tac "N. Σe K (λj{h. h  (Suc n)}. (x j) r (1r ± -a (1r ± 
 -a ((ΩK vv (Suc n)) j)^K N)^K N)) (Suc n) ± -a (x j) = 
 Σe K (λl{h. h (Suc n)}. (if l  j then (x l) r (1r ± -a (1r ± -a 
 ((ΩK vv (Suc n)) l)^K N)^K N) else (x j) r (1r ± -a (1r ±
        -a ((ΩK vv (Suc n)) l)^K N)^K N  ± -a 1r))) (Suc n)")
 apply (simp del:nsum_suc)
apply (thin_tac "N. Σe K (λj{h. h  (Suc n)}. (x j) r (1r ± -a (1r ± 
 -a (ΩK vv (Suc n)) j^K N)^K N)) (Suc n) ± -a (x j) = Σe K (λl{h. h  (Suc n)}. if l  j then (x l) r (1r ± -a (1r ± -a (ΩK vv (Suc n)) l^K N)^K N) else (x j) r (1r ± -a (1r ± -a (ΩK vv (Suc n)) l^K N)^K N ± -a 1r)) (Suc n)")
prefer 2 apply (rule allI) 
 apply (rule eSum_minus_x, assumption+)
 apply (rule allI, rule impI) apply (rule ApproximationTr0)
 apply (simp add:Ostrowski_base_mem) apply assumption
 apply (rule ballI, simp)
 apply simp  
 apply (frule Ring.ring_one[of "K"]) 
 apply (cut_tac aa = "(ΩK vv (Suc n)) j" and N = N in 
                                               ApproximationTr0)
 apply (simp add:Ostrowski_base_mem)
 apply (subst aGroup.ag_pOp_assoc, assumption+)
 apply (rule aGroup.ag_mOp_closed, assumption+)+
 apply (subst aGroup.ag_pOp_commute[of "K" _ "-a 1r"], assumption+)
 apply (rule aGroup.ag_mOp_closed, assumption+)+

 apply (subst aGroup.ag_pOp_assoc[THEN sym], assumption+)
 apply (rule aGroup.ag_mOp_closed, assumption+)+
 apply (simp add:aGroup.ag_r_inv1)
 apply (subst aGroup.ag_l_zero, assumption+) apply (simp add:aGroup.ag_mOp_closed)
 apply simp (* subgoal 2 done **)

 apply (subgoal_tac "L. N. L < N  
  (ja  (Suc n). (an m)  ((vv j  (λl{h. h  (Suc n)}. if l  j then (x l) r (1r ± -a (1r ± -a ((ΩK vv (Suc n)) l)^K N)^K N) else (x j) r (1r ± -a (1r ± -a ((ΩK vv (Suc n)) l)^K N)^K N ± -a 1r))) ja))")

(*
 apply (subgoal_tac "∃L. ∀N. L < N ⟶ (an m) ≤ Amin (Suc n) (vv j ∘ (λl∈Nset (Suc n). if l≠j then (x l) ⋅K (1K +K -K (1K +K -K ((ΩK vv (Suc n)) l)^KN)^KN)
 else (x j) ⋅K (1K +K  -K (1K +K -K ((ΩK vv (Suc n)) l)^KN)^KN
+K -K 1K)))")
 apply (erule exE)
 apply (subgoal_tac "∀N. L < N ⟶
  ((an m) ≤ ((vv j) (eΣ K (λl∈Nset (Suc n). (if l ≠ j then (x l) ⋅K
(1K +K -K (1K +K -K ((ΩK vv (Suc n)) l)^KN)^KN) else (x j) ⋅K (1K +K -K 
(1K +K -K ((ΩK vv (Suc n)) l)^KN)^KN +K -K 1K))) (Suc n))))")
apply blast
*)

apply (erule exE)
apply (rename_tac M)
 apply (subgoal_tac "N. M < (N::nat) 
   (an m)  (vv j (Σe K (λl{h. h  (Suc n)}. (if l  j then 
   (x l) r  (1r ± -a (1r ± -a ((ΩK vv (Suc n)) l)^K N)^K N)
   else (x j) r (1r ± -a (1r ± -a ((ΩK vv (Suc n)) l)^K N)^K N
   ± -a 1r))) (Suc n)))")
 apply blast
 apply (rule allI, rule impI)  
apply (drule_tac a = N in forall_spec, assumption)
 apply (rule value_ge_add[of "vv j" "Suc n" _ "an m"], assumption+)
 
apply (rule allI, rule impI)
 apply (frule Ring.ring_one[of "K"])
 apply (case_tac "ja = j", simp)
 apply (rule Ring.ring_tOp_closed, assumption+, simp)
 apply (rule aGroup.ag_pOp_closed, assumption+)+
 apply (rule aGroup.ag_mOp_closed, assumption+)
 apply (rule Ring.npClose, assumption)
 apply (rule aGroup.ag_pOp_closed, assumption+)
 apply (rule aGroup.ag_mOp_closed, assumption)
 apply (rule Ring.npClose, assumption)
 apply (simp add:Ostrowski_base_mem)
 apply (rule aGroup.ag_mOp_closed, assumption+)

apply simp
 apply (rule Ring.ring_tOp_closed, assumption+, simp)
 apply (rule aGroup.ag_pOp_closed, assumption+)+
 apply (rule aGroup.ag_mOp_closed, assumption+)
 apply (rule Ring.npClose, assumption)
 apply (rule aGroup.ag_pOp_closed, assumption+)
 apply (rule aGroup.ag_mOp_closed, assumption)
 apply (rule Ring.npClose, assumption)
 apply (simp add:Ostrowski_base_mem) 

apply assumption

 apply (subgoal_tac "N. ja  (Suc n). (1r ± -a (1r ± -a 
 ((ΩK vv (Suc n)) ja)^K N)^K N)  carrier K")
 apply (subgoal_tac "N. (1r ± -a (1r ± -a ((ΩK vv (Suc n)) j)^K N)^K N
                         ± -a 1r)  carrier K")
 apply (simp add:val_t2p) 
 apply (cut_tac multi_inequalityTr0[of "Suc n" "(vv j)  x" "m"])
 apply (subgoal_tac "ja  (Suc n). (vv j  x) ja  - ", simp)
 apply (erule exE)
 apply (subgoal_tac "N. L < N  (ja  (Suc n). (ja  j 
an m  vv j (x ja) + (vv j (1r ± -a (1r ± -a ((ΩK vv (Suc n)) ja)^K N)^K N)))
  (ja = j  (an m)  vv j (x j) +  (vv j (1r ± -a (1r ± 
  -a ((ΩK vv (Suc n)) j)^K N)^K N ± -a (1r)))))")
 apply blast
 apply (rule allI, rule impI)+

apply (case_tac "ja = j", simp)
 apply (thin_tac "N. 1r ± -a (1r ± -a (ΩK vv (Suc n)) j^K N)^K N ± -a 1r  
        carrier K")
 apply (thin_tac "lSuc n. x l  carrier K")
 apply (drule_tac x = N in spec)
 apply (drule_tac a = j in forall_spec, assumption,
        thin_tac "jaSuc n. 1r ± -a (1r ± -a (ΩK vv (Suc n)) ja^K N)^K N 
         carrier K")
apply (cut_tac N = N in ApproximationTr0 [of "(ΩK vv (Suc n)) j"])
 apply (simp add:Ostrowski_base_mem)
 apply (frule Ring.ring_one[of "K"], frule aGroup.ag_mOp_closed[of "K" "1r"],
         assumption) apply (
        frule_tac x = "(1r ± -a ((ΩK vv (Suc n)) j)^K N)^K N" in  
        aGroup.ag_mOp_closed[of "K"], assumption+)
 apply (simp only:aGroup.ag_pOp_assoc) 
 apply (simp only:aGroup.ag_pOp_commute[of "K" _ "-a 1r"])
 apply (simp only:aGroup.ag_pOp_assoc[THEN sym])
 apply (simp add:aGroup.ag_r_inv1)
 apply (simp add:aGroup.ag_l_zero) apply (simp only:val_minus_eq) 
  apply (thin_tac "(1r ± -a (ΩK vv (Suc n)) j^K N)^K N  carrier K",
         thin_tac "-a (1r ± -a (ΩK vv (Suc n)) j^K N)^K N  carrier K")
 apply (subst val_exp_ring[THEN sym, of "vv j"], assumption+)
  apply (rule aGroup.ag_pOp_closed[of "K"], assumption+)
  apply (rule aGroup.ag_mOp_closed[of "K"], assumption)
  apply (rule Ring.npClose, assumption+) apply (simp add:Ostrowski_base_mem)
 apply (rule Ostrowski_base_npow_not_one) apply simp apply assumption+
 apply (drule_tac a = N in forall_spec, assumption) 
 apply (drule_tac a = j in forall_spec, assumption) 
 apply (frule Ostrowski_baseTr1[of "n" "vv" "j"], assumption+)
 apply (frule_tac n = "N - Suc 0" in val_1mx_pow[of "vv j" "(ΩK vv (Suc n)) j"])
 apply (simp add:Ostrowski_base_mem) apply assumption
 apply (thin_tac "vv j (x j)  - ")  apply (simp only:Suc_pred)
 apply (thin_tac "0 < vv j (1r ± -a ((ΩK vv (Suc n)) j))")
 apply (cut_tac b = "vv j (1r ± -a ((ΩK vv (Suc n)) j)^K N)" and N = N in 
        asprod_ge) apply assumption apply simp
 apply (cut_tac x = "an N" and y = "int N *a vv j (1r ± -a ((ΩK vv (Suc n)) j)^K N)" in aadd_le_mono[of _ _ "vv j (x j)"], assumption) 
 apply (simp add:aadd_commute)

apply simp
apply (frule_tac aa = "(ΩK vv (Suc n)) ja" and N = N in 
       ApproximationTr2[of "vv j"])
   apply (simp add:Ostrowski_base_mem)
   apply (rule Ostrowski_base_nonzero, assumption+) 
apply (frule_tac l = ja in Ostrowski_baseTr0[of "n" "vv"], assumption+,
       erule conjE) 
 apply (rotate_tac -1, frule_tac a = j in forall_spec) apply assumption
 apply (frule_tac x = j in bspec, simp)
 apply (rule aless_imp_le) apply blast
 apply (rotate_tac -5, 
        drule_tac a = N in forall_spec, assumption)
 apply (rotate_tac -2, 
        drule_tac a = ja in forall_spec, assumption)  apply (
        drule_tac a = ja in forall_spec, assumption)
 apply (frule_tac l = ja in Ostrowski_baseTr0[of  "n" "vv"], assumption+)
 apply (erule conjE, rotate_tac -1, 
        frule_tac a = j in forall_spec, assumption+)
  apply (thin_tac "vv j (x ja)  - ")
 apply (cut_tac b = "vv j ((ΩK vv (Suc n)) ja)" and N = N in asprod_ge)
 apply simp apply simp
 apply (frule_tac x = "an N" and y = "int N *a vv j ((ΩK vv (Suc n)) ja)" and 
        z = "vv j (x ja)" in aadd_le_mono)
 apply (frule_tac x = "int N *a vv j ((ΩK vv (Suc n)) ja)" and y = "(vv j)
     (1r ± -a (1r ± -a ((ΩK vv (Suc n)) ja)^K N)^K N)" and z = "vv j (x ja)"
      in aadd_le_mono)
 apply (frule_tac i = "an N + vv j (x ja)" and 
       j = "int N *a vv j ((ΩK vv (Suc n)) ja) + vv j (x ja)" and 
       k = "vv j (1r ± -a (1r ± -a ((ΩK vv (Suc n)) ja)^K N)^K N) +
          vv j (x ja)" in ale_trans, assumption+)
 apply (subst aadd_commute)
 apply (frule_tac x = "an m" and y = "vv j (x ja) + an N" in aless_imp_le)
 apply (rule_tac j = "vv j (x ja) + an N" in ale_trans[of "an m"],
                  assumption) 
 apply (simp add:aadd_commute)
 apply (rule allI, rule impI, subst comp_def)
 apply (frule_tac a = ja in forall_spec, assumption)
 apply (frule_tac x = "x ja" in value_in_aug_inf[of "vv j"], assumption+)
 apply (simp add:aug_inf_def)

apply (rule allI) 
  apply (rule aGroup.ag_pOp_closed, assumption+) apply blast
 apply (rule aGroup.ag_mOp_closed, assumption, rule Ring.ring_one, assumption)

apply ((rule allI)+, rule impI)
apply (rule_tac aa = "(ΩK vv (Suc n)) ja" in ApproximationTr1,
       simp add:Ostrowski_base_mem)
done
 
definition
  app_lb :: "[_ , nat, nat  'b  ant, nat  'b, nat]  
            (nat  nat)"   ("(5Ψ⇘_ _ _ _ _)" [98,98,98,98,99]98) where
  K n vv x m = (λj{h. h  n}. (SOME L. (N. L < N 
  (an m)  (vv j (Σe K (λj{h. h  n}. (x j) rK (1rK ±K -aK
  (1rK ±K -aK ((ΩK vv n) j)^K N)^K N)) n ±K -aK (x j))))))"
 (** Approximation lower bound **)

lemma (in Corps) app_LB:"vals_nonequiv K (Suc n) vv; 
      l (Suc n). x l  carrier K; j  (Suc n) 
        N. (ΨK (Suc n) vv x m) j < N  (an m)  
  (vv j (Σe K (λj{h. h  (Suc n)}. (x j) r (1r ± -a (1r ± 
  -a ((ΩK vv (Suc n)) j)^K N)^K N)) (Suc n) ± -a (x j)))"
apply (frule ApproximationTr3[of "n" "vv" "x" "j" "m"], 
                               assumption+)
apply (simp del:nsum_suc add:app_lb_def)  apply (rule allI)
apply (rule someI2_ex) apply assumption+
apply (rule impI) apply blast
done

lemma (in Corps) ApplicationTr4:"vals_nonequiv K (Suc n) vv;  
 j{h. h  (Suc n)}. x j  carrier K  
 l. N. l < N  (j  (Suc n).  (an m)  
  (vv j (Σe K (λj{h. h  (Suc n)}. (x j) r (1r ± -a (1r ± 
  -a ((ΩK vv (Suc n)) j)^K N)^K N)) (Suc n) ± -a (x j))))"
apply (subgoal_tac "N. (m_max (Suc n) (ΨK (Suc n) vv x m)) < N  
  (j (Suc n).  (an m)  
  (vv j (Σe K (λj{h. h  (Suc n)}. (x j) r (1r ± -a (1r ±  
  -a ((ΩK vv (Suc n)) j)^K N)^K N)) (Suc n) ± -a (x j))))")
apply blast
 apply (rule allI, rule impI)+ 
apply (frule_tac j = j in  app_LB[of  "n" "vv" "x" _ "m"],
       simp, assumption,
       subgoal_tac "(ΨK (Suc n) vv x m) j < N", blast)
apply (frule_tac l = j and n = "Suc n" and f = K (Suc n) vv x m" in m_max_gt,
       frule_tac x = "(ΨK (Suc n) vv x m) j" and 
       y = "m_max (Suc n) (ΨK (Suc n) vv x m)" and z = N in le_less_trans, 
       assumption+)
done

theorem (in Corps) Approximation_thm:"vals_nonequiv K (Suc n) vv; 
j (Suc n). (x j)  carrier K  
ycarrier K. j (Suc n). (an m)  (vv j (y ± -a (x j)))"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"]) 
apply (subgoal_tac "l. (N. l < N  (j  (Suc n). (an m)  ((vv j) ((nsum K (λj{h. h  (Suc n)}. (x j) r (1r ± -a (1r ± -a ((ΩK vv (Suc n)) j)^K N)^K N)) (Suc n)) ± -a (x j)))))") 
 apply (erule exE)
 apply (rename_tac M)
 apply (subgoal_tac "j (Suc n). (an m) 
 (vv j ( (Σe K (λj{h. h  (Suc n)}. (x j) r (1r ± -a (1r ± 
  -a ((ΩK vv (Suc n)) j)^K (Suc M))^K (Suc M))) (Suc n)) ± -a (x j)))")
 apply (subgoal_tac "Σe K (λj{h. h  (Suc n)}. (x j) r (1r ± 
 -a (1r ± -a ((ΩK vv (Suc n)) j)^K (Suc M))^K (Suc M))) (Suc n)  carrier K")
 apply blast
 apply (rule aGroup.nsum_mem[of "K" "Suc n"], assumption+)
 apply (rule allI, rule impI, simp del:nsum_suc npow_suc)
 apply (rule Ring.ring_tOp_closed, assumption+, simp,
        rule ApproximationTr1, simp add:Ostrowski_base_mem)

 apply (subgoal_tac "M < Suc M") apply blast
 apply simp
 apply (rule ApplicationTr4[of n vv x], assumption+)
 apply simp
done

definition
  distinct_pds :: "[_, nat, nat  ('b  ant) set]  bool" where
  "distinct_pds K n P  (j n. P j  Pds K)  
          (l n. m n. l  m  P l  P m)"

 (** pds --- prime divisors **)
lemma (in Corps) distinct_pds_restriction:"distinct_pds K (Suc n) P  
       distinct_pds K n P"  
apply (simp add:distinct_pds_def) 
done

lemma (in Corps) ring_n_distinct_prime_divisors:"distinct_pds K n P 
       Ring (Sr K {x. xcarrier K  (j n. 0  ((ν K (P j)) x))})"
apply (simp add:distinct_pds_def) apply (erule conjE)
apply (cut_tac field_is_ring)
apply (rule Ring.Sr_ring, assumption+)
apply (subst sr_def)
 apply (rule conjI)
 apply (rule subsetI) apply simp
 apply (rule conjI)
 apply (simp add:Ring.ring_one)
apply (rule allI, rule impI) 
 apply (cut_tac P = "P j" in representative_of_pd_valuation, simp,
        simp add:value_of_one) 
apply (rule ballI)+
 apply simp
 apply (frule Ring.ring_is_ag[of "K"]) apply (erule conjE)+
 apply (frule_tac x = y in aGroup.ag_mOp_closed[of "K"], assumption+)
 apply (frule_tac x = x and y = "-a y" in aGroup.ag_pOp_closed[of "K"], 
        assumption+)
 apply simp
 apply (rule conjI)
 apply (rule allI, rule impI)
 apply (rotate_tac -4, frule_tac a = j in forall_spec, assumption,
        rotate_tac -3,
        drule_tac a = j in forall_spec, assumption)
 apply (cut_tac P = "P j" in representative_of_pd_valuation, simp)
 apply (frule_tac v = K (P j)" and x = x and y = "-a y" in amin_le_plus, 
        assumption+) 
 apply (simp add:val_minus_eq)
 apply (frule_tac x = "(νK (P j)) x" and y = "(νK (P j)) y" in amin_ge1[of "0"])
        apply simp
 apply (rule_tac j = "amin ((νK (P j)) x) ((νK (P j)) y)" and k = "(νK (P j)) (x ± -a y)" in ale_trans[of "0"], assumption+)
 apply (simp add:Ring.ring_tOp_closed)
 
apply (rule allI, rule impI,
       cut_tac P = "P j" in representative_of_pd_valuation, simp,
       subst val_t2p [where v=K P j"], assumption+,
       rule aadd_two_pos, simp+)
done

lemma (in Corps) distinct_pds_valuation:"j  (Suc n);
       distinct_pds K (Suc n) P   valuation K (νK (P j))"
 apply (rule_tac P = "P j" in representative_of_pd_valuation) 
 apply (simp add:distinct_pds_def)
done

lemma (in Corps) distinct_pds_valuation1:"0 < n; j  n; distinct_pds K n P
   valuation K (νK (P j))"
apply (rule distinct_pds_valuation[of "j" "n - Suc 0" "P"]) 
apply simp+
done

lemma (in Corps) distinct_pds_valuation2:"j  n; distinct_pds K n P  
          valuation K (νK (P j))"
apply (case_tac "n = 0",
       simp add:distinct_pds_def,
       subgoal_tac "0  {0::nat}",
       simp add:representative_of_pd_valuation[of "P 0"],
       simp)
 
 apply (simp add:distinct_pds_valuation1[of "n"])
done

definition
  ring_n_pd :: "[('b, 'm) Ring_scheme, nat  ('b  ant) set,
                             nat ]  ('b, 'm) Ring_scheme"
                 ("(3O⇘_ _ _)" [98,98,99]98) where
  "OK P n = Sr K {x. x  carrier K 
           (j  n. 0  ((νK (P j)) x))}" 
  (** ring defined by n prime divisors **)

lemma (in Corps) ring_n_pd:"distinct_pds K n P  Ring (OK P n)"
by (simp add:ring_n_pd_def, simp add:ring_n_distinct_prime_divisors)

lemma (in Corps) ring_n_pd_Suc:"distinct_pds K (Suc n) P  
          carrier (O K P (Suc n))  carrier (OK P n)"
apply (rule subsetI)
 apply (simp add:ring_n_pd_def Sr_def)
done

lemma (in Corps) ring_n_pd_pOp_K_pOp:"distinct_pds K n P; xcarrier (OK P n);
 y  carrier (OK P n)   x ±(OK P n) y = x ± y" 
apply (simp add:ring_n_pd_def Sr_def)
done

lemma (in Corps) ring_n_pd_tOp_K_tOp:"distinct_pds K n P; x carrier (OK P n);
      y  carrier (OK P n)   x r(OK P n) y = x r y" 
apply (simp add:ring_n_pd_def Sr_def)
done

lemma (in Corps) ring_n_eSum_K_eSumTr:"distinct_pds K n P  
  (jm. f j  carrier (OK P n))  nsum (OK P n) f m = nsum K f m"
apply (induct_tac m)
 apply (rule impI, simp)

 apply (rule impI, simp,
        subst ring_n_pd_pOp_K_pOp, assumption+,
        frule_tac n = n in ring_n_pd[of _ "P"],
        frule_tac Ring.ring_is_ag, drule sym, simp)
 apply (rule aGroup.nsum_mem, assumption+, simp+)
done

lemma (in Corps) ring_n_eSum_K_eSum:"distinct_pds K n P; 
      j  m. f j  carrier (OK P n)  nsum (OK P n) f m = nsum K f m"
apply (simp add:ring_n_eSum_K_eSumTr)
done

lemma (in Corps) ideal_eSum_closed:"distinct_pds K n P; ideal (OK P n) I; 
      j  m. f j  I   nsum K f m  I"
apply (frule ring_n_pd[of "n" "P"]) thm Ring.ideal_nsum_closed
 apply (frule_tac n = m in 
       Ring.ideal_nsum_closed[of "(OK P n)" "I" _ "f"], assumption+)
 apply (subst ring_n_eSum_K_eSum [THEN sym, of n P m f], assumption+,
        rule allI, simp add:Ring.ideal_subset)
 apply assumption
done

definition
  prime_n_pd :: "[_, nat  ('b  ant) set,
                             nat, nat]  'b set"
                 ("(4P⇘_ _ _ _)" [98,98,98,99]98) where
  "PK P n j = {x. x  (carrier (OK P n))  0 < ((νK (P j)) x)}"

lemma (in Corps) zero_in_ring_n_pd_zero_K:"distinct_pds K n P  
                               𝟬(OK P n) = 𝟬K"
apply (simp add:ring_n_pd_def Sr_def)
done

lemma (in Corps) one_in_ring_n_pd_one_K:"distinct_pds K n P 
                                      1r(OK P n) = 1r"
apply (simp add:ring_n_pd_def Sr_def)
done

lemma (in Corps) mem_ring_n_pd_mem_K:"distinct_pds K n P; x carrier (OK P n)
  x  carrier K" 
apply (simp add:ring_n_pd_def Sr_def)
done

lemma (in Corps) ring_n_tOp_K_tOp:"distinct_pds K n P; x  carrier (OK P n); 
      y  carrier (OK P n)   x r(OK P n) y = x r y"
apply (simp add:ring_n_pd_def Sr_def)
done

lemma (in Corps) ring_n_exp_K_exp:"distinct_pds K n P; x  carrier (OK P n)
         x^K m = x^(OK P n) m" 
apply (frule ring_n_pd[of "n" "P"])
apply (induct_tac m) apply simp
 apply (simp add:one_in_ring_n_pd_one_K)

apply simp
 apply (frule_tac n = na in Ring.npClose[of "OK P n" "x"], assumption+)
 apply (simp add:ring_n_tOp_K_tOp)
done   

lemma (in Corps) prime_n_pd_prime:"distinct_pds K n P; j  n   
              prime_ideal (OK P n) (PK P n j)"
apply (subst prime_ideal_def)
 apply (rule conjI)
 apply (simp add:ideal_def)
 apply (rule conjI)
 apply (rule aGroup.asubg_test)
 apply (frule ring_n_pd[of "n" "P"], simp add:Ring.ring_is_ag)
 apply (rule subsetI, simp add:prime_n_pd_def)
 apply (subgoal_tac "𝟬(OK P n)  PK P n j")
 apply blast
 
 apply (simp add:zero_in_ring_n_pd_zero_K)
 apply (simp add:prime_n_pd_def)
 apply (simp add: ring_n_pd_def Sr_def) 
 apply (cut_tac field_is_ring, simp add:Ring.ring_zero)
 apply (rule conjI) apply (rule allI, rule impI)
 apply (cut_tac P = "P ja" in representative_of_pd_valuation,
        simp add:distinct_pds_def, simp add:value_of_zero)
 apply (cut_tac P = "P j" in representative_of_pd_valuation,
        simp add:distinct_pds_def, simp add:value_of_zero)
 apply (simp add:ant_0[THEN sym]) 

 apply (rule ballI)+  
 apply (simp add:prime_n_pd_def) apply (erule conjE)+ 
 apply (frule ring_n_pd [of "n" "P"], frule Ring.ring_is_ag[of "OK P n"])
 apply (frule_tac x = b in aGroup.ag_mOp_closed[of "OK P n"], assumption+)
 apply (simp add:aGroup.ag_pOp_closed)
  apply (thin_tac "Ring (OK P n)") apply (thin_tac "aGroup (OK P n)")
 apply (simp add:ring_n_pd_def Sr_def)
 apply (erule conjE)+
 apply (cut_tac v = K (P j)" and x = a and y = "-a b" in 
        amin_le_plus) 
 apply (rule_tac P = "P j" in representative_of_pd_valuation, 
        simp add:distinct_pds_def)
 apply assumption+
 apply (cut_tac P = "P j" in representative_of_pd_valuation) 
 apply (simp add:distinct_pds_def)
 apply (frule_tac x = "(νK (P j)) a" and y = "(νK (P j)) (-a b)" in 
         amin_gt[of "0"])
 apply (simp add:val_minus_eq)

apply (frule_tac y = "amin ((νK (P j)) a) ((νK (P j)) (-a b))" and
 z = "(νK (P j)) ( a ± -a b)" in aless_le_trans[of "0"], assumption+)

apply (rule ballI)+
 apply (frule ring_n_pd [of "n" "P"])
 apply (frule_tac x = r and y = x in Ring.ring_tOp_closed[of "OK P n"], 
        assumption+)
 apply (simp add:prime_n_pd_def)
 apply (cut_tac P = "P j" in representative_of_pd_valuation,
        simp add:distinct_pds_def)
 apply (thin_tac "Ring (OK P n)") 
 apply (simp add:prime_n_pd_def ring_n_pd_def Sr_def, (erule conjE)+,
        simp add:val_t2p)
 apply (subgoal_tac "0  ((νK (P j)) r)")
 apply (simp add:aadd_pos_poss, simp) 

 apply (rule conjI,
        rule contrapos_pp, simp+,
        simp add:prime_n_pd_def,
        (erule conjE)+, simp add: one_in_ring_n_pd_one_K,
        simp add:distinct_pds_def, (erule conjE)+,
        cut_tac representative_of_pd_valuation[of "P j"],
        simp add:value_of_one, simp) 

apply ((rule ballI)+, rule impI)
 apply (rule contrapos_pp, simp+, erule conjE,
        simp add:prime_n_pd_def, (erule conjE)+,
        simp add:ring_n_pd_def Sr_def, (erule conjE)+, 
        simp add:aneg_less,
        frule_tac x = "(νK (P j)) x" in ale_antisym[of _ "0"], simp,
        frule_tac x = "(νK (P j)) y" in ale_antisym[of _ "0"], simp)

 apply (simp add:distinct_pds_def, (erule conjE)+,
        cut_tac representative_of_pd_valuation[of "P j"],
        simp add:val_t2p aadd_0_l,
        simp)
done 

lemma (in Corps) n_eq_val_eq_idealTr:
"distinct_pds K n P; x  carrier (OK P n); y  carrier (OK P n); 
j  n. ((νK (P j)) x)  ((νK (P j)) y)  Rxa (OK P n) y  Rxa (OK P n) x"
apply (subgoal_tac "j  n. valuation K (νK (P j))")
 apply (case_tac "x = 𝟬(OK P n)",
        simp add:zero_in_ring_n_pd_zero_K)
 apply (simp add:value_of_zero)
 apply (subgoal_tac "y = 𝟬", simp,
        drule_tac a = n in forall_spec, simp,
        drule_tac a=n in forall_spec, simp)
 apply (cut_tac inf_ge_any[of "(νK (P n)) y"],
        frule ale_antisym[of "(νK (P n)) y" ""], assumption+)
 apply (rule value_inf_zero, assumption+)
 apply (simp add:mem_ring_n_pd_mem_K, assumption)
       
apply (frule ring_n_pd[of n P])
 apply (subgoal_tac "jn. 0  ((νK (P j)) (y r (xK)))")
 apply (subgoal_tac "(y r (xK))  carrier (OK P n)")
 apply (cut_tac field_frac_mul[of "y" "x"],
        frule Ring.rxa_in_Rxa[of "OK P n" "x" "y r (xK)"], assumption+, 
        simp add:ring_n_pd_tOp_K_tOp[THEN sym],
        frule Ring.principal_ideal[of "OK P n" "x"], assumption+) 
 
 apply (cut_tac Ring.ideal_cont_Rxa[of "OK P n" "(OK P n) p x" "y"],
        assumption+,
        simp add:mem_ring_n_pd_mem_K,
        simp add:mem_ring_n_pd_mem_K,
        simp add:zero_in_ring_n_pd_zero_K) 
 apply (frule Ring.rxa_in_Rxa[of "OK P n" "x" "y r (xK)"], assumption+,
        simp add:ring_n_pd_def Sr_def,
        (erule conjE)+,
        cut_tac field_is_ring, rule Ring.ring_tOp_closed, assumption+,
        cut_tac invf_closed1[of x], simp, simp,
        simp add:ring_n_pd_def Sr_def)
 apply (cut_tac Ring.ring_tOp_closed, assumption+,
        cut_tac field_is_ring, assumption+, simp+,
        cut_tac invf_closed1[of x], simp, simp)

 apply (rule allI, rule impI, drule_tac a = j in forall_spec, assumption+,
        cut_tac invf_closed1[of x], simp, erule conjE)
 apply (subst val_t2p [where v=K P j"], simp,
        rule mem_ring_n_pd_mem_K[of "n" "P" "y"], assumption+,
        frule_tac x = j in spec, simp,
        simp add:zero_in_ring_n_pd_zero_K)
 apply (subst value_of_inv [where v=K P j"], simp,
        simp add:ring_n_pd_def Sr_def, assumption+)
 apply (frule_tac x = "(νK (P j)) x" and y = "(νK (P j)) y" in ale_diff_pos,
        simp add:diff_ant_def,
        simp add:mem_ring_n_pd_mem_K[of "n" "P" "x"] zero_in_ring_n_pd_zero_K)

apply (rule allI, rule impI,
       simp add:distinct_pds_def, (erule conjE)+,
       rule_tac P = "P j" in representative_of_pd_valuation, simp)
done
 
lemma (in Corps) n_eq_val_eq_ideal:"distinct_pds K n P; x  carrier (OK P n);
      y  carrier (OK P n); j  n.((νK (P j)) x) = ((νK (P j)) y)   
                 Rxa (OK P n) x = Rxa (OK P n) y"
apply (rule equalityI)
 apply (subgoal_tac "j n. (νK (P j)) y  ((νK (P j)) x)")
 apply (rule n_eq_val_eq_idealTr, assumption+)
 apply (rule allI, rule impI, simp)

 apply (subgoal_tac "j n. (νK (P j)) x  ((νK (P j)) y)")
 apply (rule n_eq_val_eq_idealTr, assumption+)
 apply (rule allI, rule impI)
 apply simp
done  
 
definition
  mI_gen :: "[_ , nat  ('r  ant) set, nat, 'r set]  'r" where
  "mI_gen K P n I = (SOME x. x  I  
                             (j  n. (νK (P j)) x = LI K (νK (P j)) I))"

definition
  mL :: "[_, nat  ('r  ant) set, 'r set, nat]  int" where
  "mL K P I j = tna (LI K (νK (P j)) I)"

lemma (in Corps) mI_vals_nonempty:"distinct_pds K n P; ideal (OK P n) I; jn
     (νK (P j)) ` I  {}"
apply (frule ring_n_pd[of "n" "P"])
apply (frule Ring.ideal_zero [of "OK P n" "I"], assumption+)

apply (simp add:image_def)
apply blast
done

lemma (in Corps) mI_vals_LB:"distinct_pds K n P; ideal (OK P n) I; j  n 
       ((νK (P j)) `I)  LBset (ant 0)"
apply (rule subsetI)
apply (simp add:image_def, erule bexE)
 apply (frule ring_n_pd[of "n" "P"])
 apply (frule_tac h = xa in Ring.ideal_subset[of "OK P n" "I"], assumption+)
 apply (thin_tac "ideal (OK P n) I")
 apply (thin_tac "Ring (OK P n)")
 apply (simp add: ring_n_pd_def Sr_def) apply (erule conjE)+ 
 apply (drule_tac a = j in forall_spec, simp)
 
apply (simp add:LBset_def ant_0)
done

lemma (in Corps) mL_hom:"distinct_pds K n P; ideal (OK P n) I; 
      I  {𝟬(OK P n)}; I  carrier (OK P n)  
      j  n. mL K P I j  Zset" 
apply (rule allI, rule impI)
 apply (simp add:mL_def LI_def)
 apply (simp add:Zset_def)
done

lemma (in Corps) ex_Zleast_in_mI:"distinct_pds K n P; ideal (OK P n) I; j  n
       xI. (νK (P j)) x = LI K (νK (P j)) I"
apply (frule_tac j = j in mI_vals_nonempty[of "n" "P" "I"], assumption+)
 apply (frule_tac j = j in mI_vals_LB[of "n" "P" "I"], assumption+)
 apply (frule_tac A = "(νK (P j)) ` I" and z = 0 in AMin_mem, assumption+)
 apply (simp add:LI_def)
 apply (thin_tac "(νK (P j)) ` I  LBset (ant 0)")
 apply (simp add:image_def, erule bexE)
 apply (drule sym)
 apply blast
done 

lemma (in Corps) val_LI_pos:"distinct_pds K n P; ideal (OK P n) I; 
       I  {𝟬(OK P n)}; j  n  0  LI K (νK (P j)) I"
apply (frule_tac j = j in mI_vals_nonempty[of n P I], assumption+)
 apply (frule_tac j = j in mI_vals_LB[of n P I], assumption+)
 apply (frule_tac A = "(νK (P j)) ` I" and z = 0 in AMin_mem, assumption+)
 apply (simp add:LI_def)
apply (frule subsetD[of "(νK (P j)) ` I" "LBset (ant 0)" "AMin ((νK (P j)) ` I)"], assumption+)
apply (simp add:LBset_def ant_0)
done

lemma (in Corps) val_LI_noninf:"distinct_pds K n P; ideal (OK P n) I; 
       I  {𝟬(OK P n)}; j  n  LI K (νK (P j)) I  "
 apply (frule_tac j = j in mI_vals_nonempty[of "n" "P" "I"], assumption+)
 apply (frule_tac j = j in mI_vals_LB[of "n" "P" "I"], assumption+)
 apply (frule_tac A = "(νK (P j)) ` I" and z = 0 in AMin, assumption+)
 apply (thin_tac "(νK (P j)) ` I  LBset (ant 0)", 
        thin_tac "(νK (P j) ) ` I  {}")
 apply (frule ring_n_pd[of "n" "P"])
 apply (frule Ring.ideal_zero[of "OK P n" "I"], assumption+)
 apply (erule conjE, simp add:LI_def)
 apply (frule singleton_sub[of "𝟬OK P n" "I"])
 apply (frule sets_not_eq[of "I" "{𝟬OK P n}"],
        assumption+, erule bexE)
 apply (simp add:zero_in_ring_n_pd_zero_K)
 apply (subgoal_tac "xI. AMin ((νK (P j)) ` I) = (νK (P j)) x",
        erule bexE) apply simp
 apply (drule_tac x = a in bspec, assumption)
 apply (thin_tac "AMin ((νK (P j)) ` I) = (νK (P j)) x")

 apply (frule_tac h = a in Ring.ideal_subset[of "OK P n" "I"], assumption+)
 apply (frule_tac x = a in mem_ring_n_pd_mem_K[of n P], assumption+)
 apply (simp add:distinct_pds_def, (erule conjE)+)
 apply (cut_tac representative_of_pd_valuation[of "P j"])
 defer apply simp apply blast
 apply (frule_tac x = a in val_nonzero_z[of K (P j)"], assumption+,
        erule exE, simp)
 apply (thin_tac "l  n. m  n. l  m  P l  P m",
        thin_tac "(νK (P j)) a = ant z")

 apply (rule contrapos_pp, simp+)
 apply (cut_tac x = "ant z" in inf_ge_any) 
 apply (frule_tac x = "ant z" in ale_antisym[of _ ""], assumption+)
 apply simp 
done 

lemma (in Corps) Zleast_in_mI_pos:"distinct_pds K n P; ideal (OK P n) I; 
       I  {𝟬(OK P n)}; j  n  0  mL K P I j"
apply (simp add:mL_def)
apply (frule ex_Zleast_in_mI[of "n" "P" "I" "j"], assumption+,
       erule bexE, frule sym, thin_tac "(νK (P j)) x = LI K (νK (P j)) I")
apply (subgoal_tac "LI K (νK (P j)) I  ", simp)
apply (thin_tac "LI K (νK (P j)) I = (νK (P j)) x")

 apply (frule ring_n_pd[of "n" "P"])
 apply (frule_tac h = x in Ring.ideal_subset[of "OK P n" "I"], assumption+)
 apply (thin_tac "ideal (OK P n) I")
 apply (thin_tac "Ring (OK P n)")
 apply (simp add: ring_n_pd_def Sr_def) apply (erule conjE)
 apply (drule_tac a = j in forall_spec, assumption)
 apply (simp add:apos_tna_pos)
apply (rule val_LI_noninf, assumption+)
done 

lemma (in Corps) Zleast_mL_I:"distinct_pds K n P; ideal (OK P n) I; j  n;
   I  {𝟬(OK P n)}; x  I  ant (mL K P I j)  ((νK (P j)) x)"
apply (frule val_LI_pos[of "n" "P" "I" "j"], assumption+)
apply (frule apos_neq_minf[of "LI K (νK (P j)) I"])
apply (frule val_LI_noninf[of "n" "P" "I" "j"], assumption+)
apply (simp add:mL_def LI_def)
apply (simp add:ant_tna)
apply (frule Zleast_in_mI_pos[of "n" "P" "I" "j"], assumption+)

apply (frule mI_vals_nonempty[of "n" "P" "I" "j"], assumption+)
apply (frule mI_vals_LB[of "n" "P" "I" "j"], assumption+)
apply (frule AMin[of "(νK (P j)) `I" "0"], assumption+)
 apply (erule conjE)
apply (frule Zleast_in_mI_pos[of "n" "P" "I" "j"], assumption+)
 apply (simp add:mL_def LI_def)
done 

lemma (in Corps) Zleast_LI:"distinct_pds K n P; ideal (OK P n) I; j  n;
   I  {𝟬(OK P n)}; x  I  (LI K (νK (P j)) I)  ((νK (P j)) x)"
apply (frule mI_vals_nonempty[of "n" "P" "I" "j"], assumption+)
apply (frule mI_vals_LB[of "n" "P" "I" "j"], assumption+)
apply (frule AMin[of "(νK (P j)) `I" "0"], assumption+)
 apply (erule conjE)
apply (simp add:LI_def)
done

lemma (in Corps) mpdiv_vals_nonequiv:"distinct_pds K n P  
             vals_nonequiv K n (λj. νK (P j)) "  
apply (simp add:vals_nonequiv_def)
 apply (rule conjI)
 apply (simp add:valuations_def)
 apply (rule allI, rule impI)
 apply (rule representative_of_pd_valuation, 
        simp add:distinct_pds_def) 
apply  ((rule allI, rule impI)+, rule impI)
 apply (simp add:distinct_pds_def, erule conjE)
 apply (rotate_tac 4) apply (
        drule_tac a = j in forall_spec, assumption)
 apply (rotate_tac -1,
        drule_tac a = l in forall_spec, assumption, simp)
 apply (simp add:distinct_p_divisors)
done

definition
  KbaseP :: "[_, nat  ('r  ant) set, nat]  
                                          (nat  'r)  bool"  where
  "KbaseP K P n f  (j  n. f j  carrier K)  
     (j  n. l  n. (νK (P j)) (f l) =  (δj l))"

definition
  Kbase :: "[_, nat, nat  ('r  ant) set] 
                (nat  'r)" ("(3Kb⇘_ _ _)" [95,95,96]95) where
  "KbK n P  = (SOME f. KbaseP K P n f)"

lemma (in Corps) KbaseTr:"distinct_pds K n P   f. KbaseP K P n f"
apply (simp add: KbaseP_def)
 apply (frule mpdiv_vals_nonequiv[of "n" "P"])
 apply (case_tac "n = 0")
  apply (simp add:vals_nonequiv_def valuations_def)
  apply (simp add:distinct_pds_def) 
  apply (frule n_val_n_val1[of "P 0"])
  apply (frule n_val_surj[of K (P 0)"])
  apply (erule bexE)
  apply (subgoal_tac " ((λj{0::nat}. x) (0::nat))  carrier K  
         (νK (P 0)) ((λj{0::nat}. x) (0::nat)) = (δ0 0)") 
  apply blast
  apply (rule conjI)
 apply simp apply (simp add:Kronecker_delta_def)
 apply (cut_tac Approximation1_5[of "n - Suc 0" "λj. νK (P j)"])
 apply simp 
 apply simp+
 apply (rule allI, rule impI)
 apply (rule n_val_n_val1 )
 apply (simp add:distinct_pds_def)
done

lemma (in Corps) KbaseTr1:"distinct_pds K n P   KbaseP K P n (KbK n P )"
apply (subst Kbase_def)
apply (frule KbaseTr[of n P])
apply (erule exE)
apply (simp add:someI)
done 

lemma (in Corps) Kbase_hom:"distinct_pds K n P  
                       j  n. (KbK n P) j  carrier K"       
apply (frule KbaseTr1[of "n" "P"])
apply (simp add:KbaseP_def)
done

lemma (in Corps) Kbase_Kronecker:"distinct_pds K n P  
      j  n. l  n. (νK (P j)) ((KbK n P) l) = δj l"     
apply (frule KbaseTr1[of n P])
apply (simp add:KbaseP_def)
done   

lemma (in Corps) Kbase_nonzero:"distinct_pds K n P  
                        j  n. (KbK n P) j  𝟬"
apply (rule allI, rule impI)
 apply (frule Kbase_Kronecker[of n P])
 apply (subgoal_tac "(νK (P j)) ((KbK n P) j) = δj j")
 apply (thin_tac "jn. (ln. ((νK P j) ((KbK n P) l)) = δj l)")
 apply (simp add:Kronecker_delta_def)
 apply (rule contrapos_pp, simp+)
 apply (cut_tac P = "P j" in representative_of_pd_valuation)  
 apply (simp add:distinct_pds_def)
 apply (simp only:value_of_zero, simp only:ant_1[THEN sym],
        frule sym, thin_tac "  = ant 1", simp del:ant_1)
apply simp
done

lemma (in Corps) Kbase_hom1:"distinct_pds K n P  
                    j  n. (KbK n P) j  carrier K - {𝟬}"
by(simp add:Kbase_nonzero Kbase_hom)

definition
  Zl_mI :: "[_, nat  ('b  ant) set, 'b set]
                          nat  'b" where
  "Zl_mI K P I j = (SOME x. (x  I  ( (νK (P j)) x = LI K (νK (P j)) I)))"

lemma (in Corps) value_Zl_mI:"distinct_pds K n P; ideal (OK P n) I; j  n
   (Zl_mI K P I j  I)  (νK (P j)) (Zl_mI K P I j) = LI K (νK (P j)) I"
apply (subgoal_tac "x. (x  I  ((νK (P j)) x = LI K (νK (P j)) I))")
apply (subst Zl_mI_def)+
apply (rule someI2_ex, assumption+) 
apply (frule ex_Zleast_in_mI[of "n" "P" "I" "j"], assumption+)
apply (erule bexE, blast) 
done

lemma (in Corps) Zl_mI_nonzero:"distinct_pds K n P; ideal (OK P n) I; 
      I  {𝟬(OK P n)}; j  n   Zl_mI K P I j  𝟬"
apply (case_tac "n = 0")
apply (simp add:distinct_pds_def) 
 apply (frule representative_of_pd_valuation[of "P 0"])
 apply (subgoal_tac "OK P 0 = Vr K (νK (P 0))")
 apply (subgoal_tac "Zl_mI K P I 0 = Ig K (νK (P 0)) I")  
 apply simp apply (simp add:Ig_nonzero)
 apply (simp add:Ig_def Zl_mI_def)
 apply (simp add:ring_n_pd_def Vr_def)

 apply (simp)
 apply (frule value_Zl_mI[of n P I j], assumption+)
 apply (erule conjE)
 apply (rule contrapos_pp, simp+)
 apply (frule distinct_pds_valuation1[of n j P], assumption+)
 apply (simp add:value_of_zero)
 apply (simp add:zero_in_ring_n_pd_zero_K)
 apply (frule singleton_sub[of "𝟬" "I"], 
        frule sets_not_eq[of "I" "{𝟬}"], assumption,
        erule bexE, simp)
 apply (frule_tac x = a in Zleast_mL_I[of "n" "P" "I" "j"], assumption+)
 apply (frule_tac x = a in val_nonzero_z[of K (P j)"])
 apply (frule ring_n_pd[of "n" "P"])
 apply (frule_tac h = a in Ring.ideal_subset[of "OK P n" "I"], assumption+)
 apply (simp add:mem_ring_n_pd_mem_K) apply assumption

apply (simp add:zero_in_ring_n_pd_zero_K) apply assumption
apply (frule val_LI_noninf[THEN not_sym, of "n" "P" "I" "j"], assumption+)
 apply (simp add:zero_in_ring_n_pd_zero_K) apply assumption
 apply simp
done
 
lemma (in Corps) Zl_mI_mem_K:"distinct_pds K n P; ideal (OK P n) I; l  n
        (Zl_mI K P I l)  carrier K"
apply (frule value_Zl_mI[of "n" "P" "I" "l"], assumption+)
apply (erule conjE) 
 apply (frule ring_n_pd[of "n" "P"])
 apply (frule Ring.ideal_subset[of "OK P n" "I" "Zl_mI K P I l"], assumption+)
 apply (simp add:mem_ring_n_pd_mem_K[of "n" "P" "Zl_mI K P I l"])
done

definition
  mprod_exp :: "[_, nat  int, nat  'b, nat] 
               'b" where
  "mprod_exp K e f n = nprod K (λj. ((f j)K(e j))) n"

lemma (in Corps) mprod_expR_memTr:"(jn. f j  carrier K)    
                      mprod_expR K e f n  carrier K"
apply (cut_tac field_is_ring)
apply (induct_tac n)
 apply (rule impI, simp) 
 apply (simp add:mprod_expR_def)
 apply (cut_tac Ring.npClose[of K "f 0" "e 0"], assumption+)

apply (rule impI) 
 apply simp
 apply (subst Ring.mprodR_Suc, assumption+)
 apply (simp)
 apply (simp)
 apply (rule Ring.ring_tOp_closed[of K], assumption+)
 apply (rule Ring.npClose, assumption+) 
 apply simp 
done

lemma (in Corps) mprod_expR_mem:"j  n. f j  carrier K  
           mprod_expR K e f n  carrier K"
apply (cut_tac field_is_ring) 
apply (cut_tac Ring.mprod_expR_memTr[of K e n f])
apply simp
apply (subgoal_tac "f  {j. j  n}  carrier K", simp+)
done 

lemma (in Corps) mprod_Suc:" j(Suc n). e j  Zset; 
                j  (Suc n). f j  (carrier K - {𝟬})  
 mprod_exp K e f (Suc n) = (mprod_exp K e f n) r ((f (Suc n))K(e (Suc n)))"
apply (simp add:mprod_exp_def)
done

lemma (in Corps) mprod_memTr:"
 (j  n. e j  Zset)  (j  n. f j  ((carrier K) - {𝟬}))  
       (mprod_exp K e f n)  ((carrier K) - {𝟬})" 
apply (induct_tac n)
 apply (simp, rule impI, (erule conjE)+,
        simp add:mprod_exp_def, simp add:npowf_mem,
        simp add:field_potent_nonzero1) 
apply (rule impI, simp, erule conjE,
       cut_tac field_is_ring, cut_tac field_is_idom,
       erule conjE, simp add:mprod_Suc)
 apply (rule conjI)
 apply (rule Ring.ring_tOp_closed[of "K"], assumption+,
        simp add:npowf_mem)
 apply (rule Idomain.idom_tOp_nonzeros, assumption+,
        simp add:npowf_mem, assumption,
        simp add:field_potent_nonzero1) 
done

lemma (in Corps) mprod_mem:"j  n. e j  Zset; j  n. f j  ((carrier K) - {𝟬})   (mprod_exp K e f n)  ((carrier K) - {𝟬})"
apply (cut_tac mprod_memTr[of n e f]) apply simp
done

lemma (in Corps) mprod_mprodR:"j  n. e j  Zset; j  n. 0  (e j); 
 j  n. f j  ((carrier K) - {𝟬})  
              mprod_exp K e f n = mprod_expR K (nat o e) f n"
apply (cut_tac field_is_ring)
apply (simp add:mprod_exp_def mprod_expR_def) 
apply (rule Ring.nprod_eq, assumption+)
 apply (rule allI, rule impI, simp add:npowf_mem)
 apply (rule allI, rule impI, rule Ring.npClose, assumption+, simp)
apply (rule allI, rule impI)
 apply (simp add:npowf_def)
done

subsection "Representation of an ideal I as a product of prime ideals"

lemma (in Corps) ring_n_mprod_mprodRTr:"distinct_pds K n P  
       (j  m. e j  Zset)  (j  m. 0  (e j))  
       (j  m. f j  carrier (OK P n)-{𝟬(OK P n)})  
        mprod_exp K e f m = mprod_expR (OK P n) (nat o e) f m"
apply (frule ring_n_pd[of n P])
apply (induct_tac m) 
 apply (rule impI, (erule conjE)+,
        simp add:mprod_exp_def mprod_expR_def)
 apply (erule conjE, simp add:npowf_def, simp add:ring_n_exp_K_exp) 

apply (rule impI, (erule conjE)+, simp)  
 apply (subst mprod_Suc, assumption+,
        rule allI, rule impI,
        simp add:mem_ring_n_pd_mem_K,
        simp add:zero_in_ring_n_pd_zero_K)
  apply (subst Ring.mprodR_Suc, assumption+,
         simp add:cmp_def,
         simp)
  apply (simp add:ring_n_pd, simp add:npowf_def, 
         simp add:ring_n_exp_K_exp) 
 apply (subst ring_n_tOp_K_tOp, assumption+,
        rule Ring.mprod_expR_mem, simp add:ring_n_pd,
        simp,
        simp)
 apply (rule Ring.npClose, simp add:ring_n_pd, simp, simp)
done

lemma (in Corps) ring_n_mprod_mprodR:"distinct_pds K n P; j  m. e j  Zset;
 j  m. 0  (e j); j  m. f j  carrier (OK P n)-{𝟬(OK P n)} 
   mprod_exp K e f m = mprod_expR (OK P n) (nat o e) f m"
apply (simp add:ring_n_mprod_mprodRTr)
done

lemma (in Corps) value_mprod_expTr:"valuation K v   
 (j  n. e j  Zset)  (j  n. f j  (carrier K - {𝟬})) 
 v (mprod_exp K e f n) =  ASum  (λj. (e j) *a (v (f j))) n"  
apply (induct_tac n)
 apply simp
 apply (rule impI, erule conjE)
 apply(simp add:mprod_exp_def val_exp) 

apply (rule impI, erule conjE)
 apply simp
 apply (subst mprod_Suc, assumption+)
 apply (rule allI, rule impI, simp)
 apply (subst val_t2p[of v], assumption+)
 apply (cut_tac n = "n" in mprod_mem[of _ e f],
        (rule allI, rule impI, simp)+, simp)
 apply (simp add:npowf_mem, simp add:field_potent_nonzero1)
 apply (simp add:val_exp[THEN sym, of "v"]) 
done 

lemma (in Corps) value_mprod_exp:"valuation K v; j  n. e j  Zset; 
       j  n. f j  (carrier K - {𝟬})  
     v (mprod_exp K e f n) = ASum (λj. (e j) *a (v (f j))) n"  
apply (simp add:value_mprod_expTr)
done

lemma (in Corps) mgenerator0_1:"distinct_pds K (Suc n) P; 
 ideal (OK P (Suc n)) I; I  {𝟬(OK P (Suc n))}; 
 I  carrier (OK P (Suc n)); j  (Suc n) 
((νK (P j)) (mprod_exp K (mL K P I) (KbK (Suc n) P) (Suc n))) = 
                   ((νK (P j)) (Zl_mI K P I j))" 
apply (frule distinct_pds_valuation[of j n P], assumption+)
 apply (frule mL_hom[of "Suc n" "P" "I"], assumption+)
 apply (frule Kbase_hom1[of "Suc n" "P"]) 
 apply (frule value_mprod_exp[of K (P j)" "Suc n" "mL K P I" 
           "KbK (Suc n) P"], assumption+)

 apply (simp del:ASum_Suc)
 apply (thin_tac "(νK (P j)) (mprod_exp K (mL K P I) (KbK (Suc n) P) (Suc n)) =
     ASum (λja. (mL K P I ja) *a (νK (P j)) ((KbK (Suc n) P) ja)) (Suc n)")
apply (subgoal_tac "ASum (λja. (mL K P I ja) *a 
      ((νK (P j)) ((KbK (Suc n) P) ja))) (Suc n) = 
                ASum (λja. (mL K P I ja) *a (δj ja)) (Suc n)")
apply (simp del:ASum_Suc)
apply (subgoal_tac "h  (Suc n). (λja. (mL K P I ja) *a (δj ja)) h  Z")
apply (cut_tac eSum_single[of "Suc n" "λja. (mL K P I ja) *a (δj ja)" "j"])
 apply simp
 apply (simp add:Kronecker_delta_def asprod_n_0)
 apply (rotate_tac -1, drule not_sym) 
apply (simp add:mL_def[of "K" "P" "I" "j"])

apply (frule val_LI_noninf[of "Suc n" "P" "I" "j"], assumption+)
 apply (rule not_sym, simp, simp)
apply (frule val_LI_pos[of "Suc n" "P" "I" "j"], assumption+,
       rotate_tac -2, frule not_sym, simp, simp)

apply (frule apos_neq_minf[of "LI K (νK (P j)) I"])
apply (simp add:ant_tna) 
apply (simp add:value_Zl_mI[of "Suc n" "P" "I" "j"])
apply (rule allI, rule impI)
 apply (simp add:Kdelta_in_Zinf, simp)
 apply (rule ballI, simp)
 apply (simp add:Kronecker_delta_def, erule conjE)
 apply (simp add:asprod_n_0)

apply (rule allI, rule impI) 
 apply (simp add:Kdelta_in_Zinf)

apply (frule  Kbase_Kronecker[of "Suc n" "P"])
 apply (rule ASum_eq,
        rule allI, rule impI,
        simp add:Kdelta_in_Zinf,
        rule allI, rule impI,
        simp add:Kdelta_in_Zinf)
apply (rule allI, rule impI) apply simp
done

lemma (in Corps) mgenerator0_2:" 0 < n; distinct_pds K n P; ideal (OK P n) I; 
 I  {𝟬(OK P n)}; I  carrier (OK P n); j  n  
((νK (P j)) (mprod_exp K (mL K P I) (KbK n P) n)) =  ((νK (P j)) (Zl_mI K P I j))"
apply (cut_tac mgenerator0_1[of  "n - Suc 0" "P" "I" "j"])
 apply simp+
done

lemma (in Corps) mgenerator1:"distinct_pds K n P; ideal (OK P n) I; 
 I  {𝟬(OK P n)}; I  carrier (OK P n); j  n 
((νK (P j)) (mprod_exp K (mL K P I) (KbK n P) n)) = ((νK (P j)) (Zl_mI K P I j))"
apply (case_tac "n = 0",
       frule value_Zl_mI[of "n" "P" "I" "j"], assumption+,
       frule val_LI_noninf[of "n" "P" "I" "j"], assumption+,
       frule val_LI_pos[of  "n" "P" "I" "j"], assumption+,
       frule apos_neq_minf[of "LI K (νK (P j)) I"],
       simp add:distinct_pds_def, erule conjE)  
 apply (cut_tac representative_of_pd_valuation[of "P j"], simp+,
        simp add:mprod_exp_def,
        subst val_exp[THEN sym, of K (P 0)" "(KbK 0 P) 0"], assumption+,
        cut_tac Kbase_hom[of "0" "P"], simp,
        simp add:distinct_pds_def,
        cut_tac Kbase_nonzero[of "0" "P"], simp+,
        simp add:distinct_pds_def) 
 apply (cut_tac Kbase_nonzero[of "0" "P"], simp add:distinct_pds_def) 
 apply (cut_tac Kbase_Kronecker[of "0" "P"], simp add:distinct_pds_def) 
 apply (simp add:Kronecker_delta_def, simp add:mL_def, simp add:ant_tna)
 apply (simp add:distinct_pds_def)+
apply (cut_tac mgenerator0_2[of "n" "P" "I" "j"], simp+)
 apply (simp add:distinct_pds_def) apply simp+
done
    
lemma (in Corps) mgenerator2Tr1:"0 < n; j  n; k  n; distinct_pds K n P 
      (νK (P j)) (mprod_exp K (λl. γk l ) (KbK n P) n) = (γk j) *a (δj j)"
apply (frule distinct_pds_valuation1[of "n" "j" "P"], assumption+)
apply (frule K_gamma_hom[of k n]) 
apply (subgoal_tac "j  n. (KbK n P) j  carrier K - {𝟬}")
apply (simp add:value_mprod_exp[of K (P j)" n "K_gamma k" "(KbK n P)"])
apply (subgoal_tac "ASum (λja. (γk ja) *a (νK (P j)) ((KbK n P) ja)) n
       = ASum (λja. (((γk ja) *a (δj ja)))) n")
 apply simp
 apply (subgoal_tac "j  n. (λja. (γk ja) *a (δj ja)) j  Z")
 apply (cut_tac eSum_single[of n "λja. ((γk ja) *a (δj ja))"  "j"], simp)
 apply (rule allI, rule impI, simp add:Kronecker_delta_def, 
        rule impI, simp add:asprod_n_0 Zero_in_aug_inf, assumption+)
 apply (rule ballI, simp)
  apply (simp add:K_gamma_def, rule impI, simp add:Kronecker_delta_def) 
  apply (rule allI, rule impI)
  apply (simp add:Kronecker_delta_def, simp add:K_gamma_def)
 apply (simp add:ant_0 Zero_in_aug_inf)
 apply (cut_tac z_in_aug_inf[of 1], simp add:ant_1) 

 apply (rule ASum_eq)
  apply (rule allI, rule impI)
  apply (simp add:K_gamma_def, simp add:Zero_in_aug_inf) 
  apply (rule impI, rule value_in_aug_inf, assumption+, simp)
  apply (simp add:K_gamma_def Zero_in_aug_inf Kdelta_in_Zinf1)
  apply (rule allI, rule impI)
  apply (simp add:Kbase_Kronecker[of "n" "P"])
  apply (rule Kbase_hom1, assumption+)
done

lemma (in Corps) mgenerator2Tr2:"0 < n; j  n; k  n; distinct_pds K n P 
     (νK (P j)) ((mprod_exp K (λl. γk l ) (KbK n P) n)Km)= ant (m * (γk j))"

apply (frule K_gamma_hom[of k n])
apply (frule Kbase_hom1[of "n" "P"])
apply (frule mprod_mem[of n "K_gamma k" "KbK n P"], assumption+)
apply (frule distinct_pds_valuation1[of "n" "j" "P"], assumption+)
apply (simp, erule conjE)
apply (simp add:val_exp[THEN sym])
apply (simp add:mgenerator2Tr1)
 apply (simp add:K_gamma_def Kronecker_delta_def)
 apply (rule impI)
 apply (simp add:asprod_def a_z_z)
done

lemma (in Corps) mgenerator2Tr3_1:"0 < n; j  n; k  n; j = k; 
      distinct_pds K n P 
          (νK (P j)) ((mprod_exp K (λl. (γk l)) (KbK n P) n)Km) = 0"
apply (simp add:mgenerator2Tr2) apply (simp add:K_gamma_def)
done

lemma (in Corps) mgenerator2Tr3_2:"0 < n; j  n; k  n; j  k; 
      distinct_pds K n P 
      (νK (P j)) ((mprod_exp K (λl. (γk l)) (KbK n P) n)Km) = ant m"
apply (simp add:mgenerator2Tr2) apply (simp add:K_gamma_def)
done

lemma (in Corps) mgeneratorTr4:"0 < n; distinct_pds K n P; ideal (OK P n) I; 
      I  {𝟬OK P n}; I  carrier (OK P n)  
       mprod_exp K (mL K P I) (KbK n P) n  carrier (OK P n)"
apply (subst ring_n_pd_def)
apply (simp add:Sr_def)
 apply (frule mL_hom[of  "n" "P" "I"], assumption+)
 apply (frule mprod_mem[of n "mL K P I" "KbK n P"])
 apply (rule Kbase_hom1, assumption+)

 apply (simp add:mprod_mem)

apply (rule allI, rule impI)
 apply (simp add:mgenerator1)
 apply (simp add:value_Zl_mI)
 apply (simp add:val_LI_pos)
done

definition
  m_zmax_pdsI_hom :: "[_, nat  ('b  ant) set, 'b set]  nat  int" where
  "m_zmax_pdsI_hom K P I = (λj. tna (AMin ((νK (P j)) ` I)))"

definition
  m_zmax_pdsI :: "[_, nat, nat  ('b  ant) set, 'b set]  int" where
  "m_zmax_pdsI K n P I = (m_zmax n (m_zmax_pdsI_hom K P I)) + 1"
 
lemma (in Corps) value_Zl_mI_pos:"0 < n; distinct_pds K n P; ideal (OK P n) I;
     I  {𝟬(OK P n)}; I  carrier (OK P n); j  n; l  n 
     0  ((νK (P j)) (Zl_mI K P I l))"
apply (frule value_Zl_mI[of "n" "P" "I" "l"], assumption+)
apply (erule conjE) 
 apply (frule ring_n_pd[of "n" "P"])
 apply (frule Ring.ideal_subset[of "OK P n" "I" "Zl_mI K P I l"], assumption+)
 apply (thin_tac "ideal (OK P n) I")
 apply (thin_tac "I  {𝟬OK P n}")
 apply (thin_tac "I  carrier (OK P n)")
 apply (thin_tac "Ring (OK P n)")
 apply (simp add:ring_n_pd_def Sr_def) 
done

lemma (in Corps) value_mI_genTr1:"0 < n; distinct_pds K n P; ideal (OK P n) I;
 I  {𝟬OK P n}; I  carrier (OK P n); j  n 
 (mprod_exp K (K_gamma j) (KbK n P) n)K(m_zmax_pdsI K n P I)  carrier K"
apply (frule K_gamma_hom[of "j" "n"])
apply (frule mprod_mem[of n "K_gamma j" "KbK n P"])
 apply (rule Kbase_hom1, assumption+)
apply (rule npowf_mem)
 apply simp+
done

lemma (in Corps) value_mI_genTr1_0:"0 < n; distinct_pds K n P; 
 ideal (OK P n) I; I  {𝟬OK P n}; I  carrier (OK P n); j  n
  (mprod_exp K (K_gamma j) (KbK n P) n)  carrier K" 
apply (frule K_gamma_hom[of "j" "n"])
apply (frule mprod_mem[of n "K_gamma j" "KbK n P"])
 apply (rule Kbase_hom1, assumption+)
 apply simp
done


lemma (in Corps) value_mI_genTr2:"0 < n; distinct_pds K n P; ideal (OK P n) I;
 I  {𝟬OK P n}; I  carrier (OK P n); j  n 
 (mprod_exp K (K_gamma j) (KbK n P) n)K(m_zmax_pdsI K n P I)  𝟬"
 apply (frule K_gamma_hom[of "j" "n"])
 apply (frule mprod_mem[of n "K_gamma j" "KbK n P"])
 apply (rule Kbase_hom1, assumption+) apply simp apply (erule conjE)
 apply (simp add: field_potent_nonzero1)
done

lemma (in Corps) value_mI_genTr3:"0 < n; distinct_pds K n P; ideal (OK P n) I;
 I  {𝟬OK P n}; I  carrier (OK P n); j  n 
 (Zl_mI K P I j) r ((mprod_exp K (K_gamma j) (KbK n P) n)K(m_zmax_pdsI K n P I))
   carrier K"
apply (cut_tac field_is_ring)
apply (rule Ring.ring_tOp_closed, assumption+)
apply (simp add:Zl_mI_mem_K)
apply (simp add:value_mI_genTr1)
done

lemma (in Corps) value_mI_gen:"0 < n; distinct_pds K n P; ideal (OK P n) I;
 I  {𝟬(OK P n)}; I  carrier (OK P n); j  n   
(νK (P j)) (nsum K (λk. ((Zl_mI K P I k) r ((mprod_exp K (λl. (γk l)) (KbK n P) n)K(m_zmax_pdsI K n P I)))) n) = LI K (νK (P j)) I"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"])
apply (case_tac "j = n", simp) 
 apply (cut_tac nsum_suc[of K "λk. Zl_mI K P I k r 
        mprod_exp K (K_gamma k) (KbK n P) nKm_zmax_pdsI K n P I" "n - Suc 0"], 
        simp,
        thin_tac "Σe K (λk. Zl_mI K P I k r
               mprod_exp K (K_gamma k) (KbK n P) nKm_zmax_pdsI K n P I) n =
     Σe K (λk. Zl_mI K P I k r
               mprod_exp K (K_gamma k) (KbK n P)
                nKm_zmax_pdsI K n P I) (n - Suc 0) ±
     Zl_mI K P I n r
     mprod_exp K (K_gamma n) (KbK n P) nKm_zmax_pdsI K n P I")
 apply (cut_tac distinct_pds_valuation[of "n" "n - Suc 0" "P"])
prefer 2 apply simp 
prefer 2 apply simp 
 apply (subst value_less_eq1[THEN sym, of K (P n)" 
 "(Zl_mI K P I n)r (mprod_exp K (K_gamma n) (KbK n P) nKm_zmax_pdsI K n P I)"
 "nsum K (λk.(Zl_mI K P I k)r (mprod_exp K (K_gamma k) (KbK n P) nKm_zmax_pdsI K n P I)) (n - Suc 0)"], assumption+) 

 apply (simp add:value_mI_genTr3)
 apply (frule Ring.ring_is_ag[of K])
 apply (rule aGroup.nsum_mem[of _ "n - Suc 0"], assumption+)
 apply (rule allI, rule impI)
 apply (simp add:value_mI_genTr3) 

 apply (subst val_t2p[of K (P n)"], assumption+)
 apply (simp add:Zl_mI_mem_K)
 apply (simp add:value_mI_genTr1) 

 apply (simp add:mgenerator2Tr3_1[of "n" "n" "n" "P"])
 apply (simp add:aadd_0_r) 
apply (frule value_Zl_mI[of "n" "P" "I" "n"], assumption+, simp)
 apply (erule conjE) 
 apply (frule_tac f = "λk. (Zl_mI K P I k) r 
       (mprod_exp K (K_gamma k) (KbK n P) nKm_zmax_pdsI K n P I)" in 
       value_ge_add[of K (P n)" "n - Suc 0" _ 
      "ant (m_zmax_pdsI K n P I)"])
 apply (rule allI, rule impI) 
 apply (rule Ring.ring_tOp_closed, assumption+)
 apply (simp add:Zl_mI_mem_K)
 apply (simp add:value_mI_genTr1)  

 apply (rule allI, rule impI) apply (simp add:cmp_def)
 apply (subst val_t2p [where v=K P n"], assumption+)
 apply (simp add:Zl_mI_mem_K)
 apply (simp add:value_mI_genTr1) 

 apply (cut_tac e = "K_gamma ja" in mprod_mem[of n  _  "KbK n P"])
 apply (simp add:Zset_def) apply (rule Kbase_hom1, assumption+)
 apply (subst val_exp[of K (P n)", THEN sym], assumption+) 
 apply simp+ 

 apply (subst mgenerator2Tr1[of "n" "n" _ "P"], assumption+, simp, simp,
        assumption+) 
 apply (simp add:K_gamma_def Kronecker_delta_def)
 apply (frule_tac l = ja in value_Zl_mI_pos[of "n" "P" "I" "n"],
        assumption+, simp, simp)
 apply (simp add:Nset_preTr1)
 apply (frule_tac y = "(νK (P n)) (Zl_mI K P I ja)" in 
  aadd_le_mono[of "0" _ "ant (m_zmax_pdsI K n P I)"]) apply (simp add:aadd_0_l)
 apply (subgoal_tac "LI K (νK (P n)) I < ant (m_zmax_pdsI K n P I)")
 apply simp
 apply (rule aless_le_trans[of "LI K (νK (P n)) I" 
                           "ant (m_zmax_pdsI K n P I)"])

 apply (simp add:m_zmax_pdsI_def)
 apply (cut_tac aless_zless[of "tna (LI K (νK (P n)) I)" 
                   "m_zmax n (m_zmax_pdsI_hom K P I) + 1"])
apply (frule val_LI_noninf[of "n" "P" "I" "n"], assumption+, simp, simp) 
apply (frule val_LI_pos[of "n" "P" "I" "n"], assumption+, simp,
       frule apos_neq_minf[of "LI K (νK (P n)) I"], simp add:ant_tna)
 apply (subst m_zmax_pdsI_hom_def)
 apply (subst LI_def)
 apply (cut_tac m_zmax_gt_each[of n "λu.(tna (AMin ((νK (P u)) ` I)))"])
 apply simp

 apply (rule allI, rule impI)
 apply (simp add:Zset_def, simp) 

 apply (subst val_t2p[of K (P n)"], assumption+)
 apply (rule Zl_mI_mem_K, assumption+, simp)
 apply (simp add:value_mI_genTr1)
 apply (simp add:mgenerator2Tr3_1[of "n" "n" "n" "P" "m_zmax_pdsI K n P I"])
 apply (simp add:aadd_0_r)
 apply (simp add:value_Zl_mI[of "n" "P" "I" "n"])

(*** case j = n done ***)
 apply (frule aGroup.addition3[of "K" "n - Suc 0" "λk. (Zl_mI K P I k) r
((mprod_exp K (K_gamma k) (KbK n P) n)K(m_zmax_pdsI K n P I))" "j"])
 
 apply simp
 apply (rule allI, rule impI) 
 apply (simp add:value_mI_genTr3) apply simp+

 apply (thin_tac "Σe K (λk. Zl_mI K P I k r
     mprod_exp K (K_gamma k) (KbK n P) nKm_zmax_pdsI K n P I) n =
     Σe K (cmp (λk. Zl_mI K P I k r
            mprod_exp K (K_gamma k) (KbK n P) nKm_zmax_pdsI K n P I) (τj n)) n")
 apply (cut_tac nsum_suc[of K "cmp (λk. Zl_mI K P I k r
     mprod_exp K (K_gamma k) (KbK n P) nKm_zmax_pdsI K n P I) (τj n)" "n - Suc 0"])
 apply (simp del:nsum_suc) apply (
        thin_tac "Σe K (cmp (λk. Zl_mI K P I k r
         mprod_exp K (K_gamma k) (KbK n P) nKm_zmax_pdsI K n P I) (τj n)) n =
     Σe K (cmp (λk. Zl_mI K P I k r
        mprod_exp K (K_gamma k) (KbK n P) nKm_zmax_pdsI K n P I) (τj n))
         (n - Suc 0) ±  (cmp (λk. Zl_mI K P I k r
         mprod_exp K (K_gamma k) (KbK n P) nKm_zmax_pdsI K n P I) (τj n)) n")
 apply (cut_tac distinct_pds_valuation[of "j" "n - Suc 0" "P"])
 prefer 2 apply simp prefer 2 apply simp
 apply (simp add:cmp_def)

 apply (cut_tac n_in_Nsetn[of "n"])
 apply (simp add:transpos_ij_2)
 apply (subst value_less_eq1[THEN sym, of K (P j)"
 "(Zl_mI K P I j) r (mprod_exp K (K_gamma j) (KbK n P)
  nKm_zmax_pdsI K n P I)" "Σe K (λx.(Zl_mI K P I ((τj n) x)) r
 (mprod_exp K (K_gamma ((τj n) x)) (KbK n P) nKm_zmax_pdsI K n P I)) (n - Suc 0)"], assumption+)
 apply (simp add:value_mI_genTr3)
 apply (rule aGroup.nsum_mem[of "K" "n - Suc 0"], assumption+)
 apply (rule allI, rule impI) 
 apply (frule_tac l = ja in transpos_mem[of "j" "n" "n"], simp+)
 apply (simp add:value_mI_genTr3) 

 apply (subst val_t2p[of K (P j)"], assumption+)
 apply (simp add:Zl_mI_mem_K) 
 apply (simp add:value_mI_genTr1)

 apply (simp add:mgenerator2Tr3_1[of "n" "j" "j" "P"])

 apply (frule value_Zl_mI[of "n" "P" "I" "j"], assumption+)
 apply (erule conjE)
 apply (simp add:aadd_0_r)
 apply (cut_tac f = "λx. (Zl_mI K P I ((τj n) x)) r
       (mprod_exp K (K_gamma ((τj n) x)) (KbK n P) nKm_zmax_pdsI K n P I)" in 
        value_ge_add[of K (P j)"
        "n - Suc 0" _ "ant (m_zmax_pdsI K n P I)"], assumption+)
 apply (rule allI, rule impI) 
 apply (frule_tac l = ja in transpos_mem[of "j" "n" "n"], simp+)
 apply (simp add:value_mI_genTr3)
 apply (rule allI, rule impI) apply (simp add:cmp_def)

 apply (frule_tac l = ja in transpos_mem[of "j" "n" "n"], simp+)

 apply (subst val_t2p [where v=K P j"], assumption+) 
 apply (simp add:Zl_mI_mem_K)
 apply (simp add:value_mI_genTr1)
 apply (cut_tac k = ja in transpos_noteqTr[of "n" _ "j"], simp+) 
 apply (subst mgenerator2Tr3_2[of "n" "j" _ "P"], simp+)
 apply (cut_tac l = "(τj n) ja" in value_Zl_mI_pos[of "n" "P" "I" "j"],
        simp+)
 apply (frule_tac y = "(νK (P j)) (Zl_mI K P I ((τj n) ja))" in 
 aadd_le_mono[of "0"  _ "ant (m_zmax_pdsI K n P I)"])
 apply (simp add:aadd_0_l)
apply (subgoal_tac "LI K (νK (P j)) I < ant (m_zmax_pdsI K n P I)")
 apply (rule aless_le_trans[of "LI K (νK (P j)) I" 
                           "ant (m_zmax_pdsI K n P I)"], assumption+)

 apply (simp add:m_zmax_pdsI_def)
 apply (cut_tac aless_zless[of "tna (LI K (νK (P j)) I)" 
                   "m_zmax n (m_zmax_pdsI_hom K P I) + 1"])
apply (frule val_LI_noninf[of  "n" "P" "I" "j"], assumption+,
       frule val_LI_pos[of  "n" "P" "I" "j"], assumption+,
       frule apos_neq_minf[of "LI K (νK (P j)) I"], simp add:ant_tna)
 apply (subst m_zmax_pdsI_hom_def)
 apply (subst LI_def)
 apply (subgoal_tac "h  n. (λu. (tna (AMin ((νK (P u)) ` I)))) h  Zset")
 apply (frule m_zmax_gt_each[of n "λu.(tna (AMin ((νK (P u)) ` I)))"])
 apply simp
 apply (rule allI, rule impI)
 apply (simp add:Zset_def)
apply (subst val_t2p[of K (P j)"], assumption+)
 apply (rule Zl_mI_mem_K, assumption+)
 apply (simp add:value_mI_genTr1)
  
 apply (simp add:mgenerator2Tr3_1[of  "n" "j" "j" "P" 
                                         "m_zmax_pdsI K n P I"])
 apply (simp add:aadd_0_r)
 apply (simp add:value_Zl_mI[of "n" "P" "I" "j"])
done

lemma (in Corps) mI_gen_in_I:"0 < n; distinct_pds K n P; ideal (OK P n) I; 
  I  {𝟬(OK P n)}; I  carrier (OK P n) 
  (nsum K (λk. ((Zl_mI K P I k) r 
  ((mprod_exp K (λl. (γk l)) (KbK n P) n)K(m_zmax_pdsI K n P I)))) n)  I"
apply (cut_tac field_is_ring, frule ring_n_pd[of n P])
apply (rule ideal_eSum_closed[of n P I n], assumption+)
apply (rule allI, rule impI)
 apply (frule_tac j = j in value_Zl_mI[of  "n" "P" "I"], assumption+) 
 apply (erule conjE)
 apply (thin_tac "(νK (P j)) (Zl_mI K P I j) = LI K (νK (P j)) I")
 apply (subgoal_tac "(mprod_exp K (K_gamma j) (KbK n P) n)K(m_zmax_pdsI K n P I)
  carrier (OK P n)") 
 apply (frule_tac x = "Zl_mI K P I j" and 
   r = "(mprod_exp K (K_gamma j) (KbK n P) n)K(m_zmax_pdsI K n P I)"
   in Ring.ideal_ring_multiple1[of "(OK P n)" "I"], assumption+) 
 apply (frule_tac h = "Zl_mI K P I j" in 
               Ring.ideal_subset[of "OK P n" "I"], assumption+)
 apply (simp add:ring_n_pd_tOp_K_tOp[of "n" "P"])
 
apply (subst ring_n_pd_def) apply (simp add:Sr_def)
 apply (simp add:value_mI_genTr1)

 apply (rule allI, rule impI)
 apply (case_tac "j = ja") 
 apply (simp add:mgenerator2Tr3_1)

 apply (simp add:mgenerator2Tr3_2)
 apply (simp add:m_zmax_pdsI_def) apply (simp add:m_zmax_pdsI_hom_def)
 apply (simp only:ant_0[THEN sym])
 apply (simp add:aless_zless)
 apply (subgoal_tac "l  n. (λj. tna (AMin ((νK (P j)) ` I))) l  Zset")
 apply (frule m_zmax_gt_each[of n "λj. tna (AMin ((νK (P j)) ` I))"]) 
 apply (rotate_tac -1, drule_tac a = ja in forall_spec, simp+)
 apply (frule_tac j = ja in val_LI_pos[of  "n" "P" "I"], assumption+) 
 apply (cut_tac j = "tna (LI K (νK (P ja)) I)" in ale_zle[of "0"]) 
apply (frule_tac j = ja in val_LI_noninf[of "n" "P" "I"], assumption+,
       frule_tac j = ja in val_LI_pos[of "n" "P" "I"], assumption+,
       frule_tac a = "LI K (νK (P ja)) I" in apos_neq_minf, simp add:ant_tna,
       simp add:ant_0) apply (unfold LI_def)
 apply (frule_tac y = "tna (AMin (νK (P ja) ` I))" and z = "m_zmax n (λj. tna (AMin (νK (P j) ` I)))" in order_trans[of "0"], assumption+)
 apply (rule_tac y = "m_zmax n (λj. tna (AMin (νK (P j) ` I)))" and 
        z = "m_zmax n (λj. tna (AMin (νK (P j) ` I))) + 1" in order_trans[of "0"],
        assumption+) apply simp

 apply (rule allI, rule impI) apply (simp add:Zset_def)
done


text‹We write the element 
        eΣ K (λk. (Zl_mI K P I k) ⋅K ((mprod_exp K (K_gamma k) (KbK n P)
                    n)K(m_zmax_pdsI K n P I))) n›
      as mIgK G a i n P I

definition
  mIg :: "[_, nat, nat  ('b  ant) set,
             'b set]  'b" ("(4mIg⇘ _ _ _ _)" [82,82,82,83]82) where
  "mIgK n P I = Σe K (λk. (Zl_mI K P I k) rK
             ((mprod_exp K (K_gamma k) (KbK n P) n)K(m_zmax_pdsI K n P I))) n"

text‹We can rewrite above two lemmas by using mIgK G a i n P I 

lemma (in Corps) value_mI_gen1:"0 < n; distinct_pds K n P; ideal (OK P n) I;
 I  {𝟬(OK P n)}; I  carrier (OK P n)  
                j  n.(νK (P j)) (mIgK n P I) = LI K (νK (P j)) I" 
apply (rule allI, rule impI)
 apply (simp add:mIg_def value_mI_gen)
done

lemma (in Corps) mI_gen_in_I1:"0 < n; distinct_pds K n P; ideal (OK P n) I; 
  I  {𝟬(OK P n)}; I  carrier (OK P n)   (mIgK n P I)  I"
apply (simp add:mIg_def mI_gen_in_I)
done

lemma (in Corps) mI_principalTr:"0 < n; distinct_pds K n P; ideal (OK P n) I; 
  I  {𝟬(OK P n)}; I  carrier (OK P n); x  I  
 j  n. ((νK (P j)) (mIgK n P I))  ((νK (P j)) x)" 
apply (simp add:value_mI_gen1)
 apply (rule allI, rule impI)
 apply (rule Zleast_LI, assumption+)
done

lemma (in Corps) mI_principal:"0 < n; distinct_pds K n P; ideal (OK P n) I; 
 I  {𝟬(OK P n)}; I  carrier (OK P n)  
                                        I = Rxa (OK P n) (mIgK n P I)"
apply (frule ring_n_pd[of "n" "P"]) 
apply (rule equalityI)
 apply (rule subsetI)
 apply (frule_tac x = x in mI_principalTr[of "n" "P" "I"],
                 assumption+)
 apply (frule_tac y = x in n_eq_val_eq_idealTr[of "n" "P" "mIgK n P I"])
 apply (frule mI_gen_in_I1[of "n" "P" "I"], assumption+)
 apply (simp add:Ring.ideal_subset)+
 apply (thin_tac "jn. (νK (P j)) (mIg K n P I)  (νK (P j)) x")
 apply (frule_tac h = x in Ring.ideal_subset[of "OK P n" "I"], assumption+)
 apply (frule_tac a = x in Ring.a_in_principal[of "OK P n"], assumption+)
 apply (simp add:subsetD)
 apply (rule Ring.ideal_cont_Rxa[of "OK P n" "I" "mIg K n P I"], assumption+)
 apply (rule mI_gen_in_I1[of  "n" "P" "I"], assumption+)
done

subsection prime_n_pd›

lemma (in Corps) prime_n_pd_principal:"distinct_pds K n P; j  n   
       (PK P n j) = Rxa (OK P n) (((KbK n P) j))"
apply (frule ring_n_pd[of "n" "P"])
apply (frule prime_n_pd_prime[of "n" "P" "j"], assumption+)
apply (simp add:prime_ideal_def, frule conjunct1)
 apply (fold prime_ideal_def)
 apply (thin_tac "prime_ideal (OK P n) (PK P n j)")
apply (rule equalityI)
 apply (rule subsetI)
 apply (frule_tac y = x in n_eq_val_eq_idealTr[of n P "(KbK n P) j"])
 apply (thin_tac "Ring (OK P n)", thin_tac "ideal (OK P n) (PK P n j)")
 apply (simp add:ring_n_pd_def Sr_def)
 apply (frule Kbase_hom[of  "n" "P"], simp)
 apply (rule allI, rule impI)
 apply (frule Kbase_Kronecker[of "n" "P"])
 apply (simp add:Kronecker_delta_def, rule impI)
 apply (simp only:ant_0[THEN sym], simp only:ant_1[THEN sym])
 apply (simp del:ant_1)
 apply (simp add:prime_n_pd_def)


 apply (rule allI, rule impI)
 apply (frule Kbase_Kronecker[of "n" "P"])
 apply simp
 apply (thin_tac "jn. ln. (νK (P j)) ((KbK n P) l) = δj l")
 apply (case_tac "ja = j", simp add:Kronecker_delta_def)
 apply (thin_tac "ideal (OK P n) (PK P n j)")
 apply (simp add:prime_n_pd_def, erule conjE)
 apply (frule_tac x = x in  mem_ring_n_pd_mem_K[of "n" "P"],
                                         assumption+)
 apply (case_tac "x = 𝟬K")
 apply (frule distinct_pds_valuation2[of "j" "n" "P"], assumption+)
 apply (rule gt_a0_ge_1, assumption)+

 apply (simp add:Kronecker_delta_def)
 apply (frule_tac j = ja in distinct_pds_valuation2[of  _ "n" "P"],
         assumption+)
 apply (simp add:prime_n_pd_def, erule conjE)
 apply (thin_tac "ideal (OK P n) {x. x  carrier (OK P n)  0 < (νK (P j)) x}")
 apply (simp add:ring_n_pd_def Sr_def)
 apply (cut_tac h = x in Ring.ideal_subset[of "OK P n" "PK P n j"])
 apply (frule_tac a = x in Ring.a_in_principal[of "OK P n"])
 apply (simp add:Ring.ideal_subset, assumption+)


apply (rule_tac c = x and A = "(OK P n) p x" and B = "(OK P n) p (KbK n P) j"
       in subsetD, assumption+)
apply (simp add:Ring.a_in_principal)
 apply (rule Ring.ideal_cont_Rxa[of "OK P n" "PK P n j" "(KbK n P) j"], assumption+)
 apply (subst prime_n_pd_def, simp)
 apply (frule Kbase_Kronecker[of "n" "P"])
 apply (simp add:Kronecker_delta_def) 
 apply (simp only:ant_1[THEN sym], simp only:ant_0[THEN sym])
 apply (simp del:ant_1 add:aless_zless)
apply (subst ring_n_pd_def, simp add:Sr_def)
 apply (frule Kbase_hom[of "n" "P"])
 apply simp
 apply (rule allI) 
 apply (simp add:ant_0)
 apply (rule impI)
  apply (simp only:ant_1[THEN sym], simp only:ant_0[THEN sym])
  apply (simp del:ant_1)
done

lemma (in Corps) ring_n_prod_primesTr:"0 < n; distinct_pds K n P; 
 ideal (OK P n) I; I  {𝟬OK P n}; I  carrier (OK P n) 
 j  n.(νK (P j)) (mprod_exp K (mL K P I) (KbK n P) n) = 
                   (νK (P j)) (mIgK n P I)"
apply (rule allI, rule impI)
 apply (simp add:mgenerator1)
 apply (simp add:value_mI_gen1)

 apply (simp add:value_Zl_mI)
done

lemma (in Corps) ring_n_prod_primesTr1:"0 < n; distinct_pds K n P;  
      ideal (OK P n) I; I  {𝟬OK P n}; I  carrier (OK P n)  
       I = (OK P n) p (mprod_exp K (mL K P I) (KbK n P) n)"
apply (frule ring_n_pd[of "n" "P"])
apply (subst n_eq_val_eq_ideal[of "n" "P" "mprod_exp K (mL K P I)
       (KbK n P) n" "mIgK n P I"], assumption+)
apply (simp add:mgeneratorTr4) 
apply (frule mI_gen_in_I1[of "n" "P" "I"], assumption+)
apply (simp add:Ring.ideal_subset)
apply (simp add:ring_n_prod_primesTr)
apply (simp add:mI_principal)
done

lemma (in Corps) ring_n_prod_primes:"0 < n; distinct_pds K n P;  
      ideal (OK P n) I; I  {𝟬OK P n}; I  carrier (OK P n); 
     k  n. J k = (PK P n k)(OK P n) (nat ((mL K P I) k))  
       I =(OK P n),n J" 
apply (simp add:prime_n_pd_principal[of "n" "P"])
apply (subst ring_n_prod_primesTr1[of "n" "P" "I"], assumption+)
apply (frule ring_n_pd[of "n" "P"])
apply (frule Ring.prod_n_principal_ideal[of "OK P n" "nat o (mL K P I)" "n" 
       "KbK n P" "J"])
 apply (frule Kbase_hom[of "n" "P"])
 apply (simp add:nat_def)
 apply (subst ring_n_pd_def) apply (simp add:Sr_def) 
 apply (rule Pi_I, simp)
 apply (simp add:Kbase_Kronecker[of  "n" "P"])
 apply (simp add:Kronecker_delta_def) 
  apply (simp only:ant_1[THEN sym], simp only:ant_0[THEN sym])
  apply (simp del:ant_1)
  apply (simp add:Kbase_hom) apply simp 

 apply simp
 apply (frule ring_n_mprod_mprodR[of "n" "P" n "mL K P I"  "KbK n P"])
  apply (rule allI, rule impI, simp add:Zset_def)
  apply (rule allI, rule impI) 
  apply (simp add: Zleast_in_mI_pos)

 apply (rule allI, rule impI)
 apply (subst ring_n_pd_def) apply (simp add:Sr_def)
 apply (frule Kbase_hom1[of  "n" "P"], simp)
 apply (simp add:zero_in_ring_n_pd_zero_K)
 apply (frule Kbase_Kronecker[of  "n" "P"])
 apply (simp add:Kronecker_delta_def) 
  apply (simp only:ant_1[THEN sym], simp only:ant_0[THEN sym])
  apply (simp del:ant_1)
apply simp
done

end

Theory Valuation3

(**        Valuation3  
                            author Hidetsune Kobayashi
                            Group You Santo
                            Department of Mathematics
                            Nihon University
                            h_coba@math.cst.nihon-u.ac.jp
                            June 24, 2005
                            July 20, 2007

   chapter 1. elementary properties of a valuation
     section 9. completion 
      subsection Hensel's theorem
   **)

theory Valuation3 
imports Valuation2
begin

section "Completion"

text‹In this section we formalize "completion" of the ground field K›

definition
  limit :: "[_, 'b  ant, nat  'b, 'b]
            bool" ("(4lim⇘ _ _ _ _)" [90,90,90,91]90) where
  "limK v f b  (N. M. (n. M < n  
                ((f n) ±K (-aK b))  (vp K v) (Vr K v) (an N)))"

(* In this definition, f represents a sequence of elements of K, which is
   converging to b. Key lemmas of this section are n_value_x_1 and
   n_value_x_2 *) 


lemma not_in_singleton_noneq:"x  {a}  x  a"
apply simp
done   (* later move this lemma to Algebra1 *) 

lemma noneq_not_in_singleton:"x  a  x  {a}"
apply simp
done

lemma inf_neq_1[simp]:"  1"
by (simp only:ant_1[THEN sym], rule z_neq_inf[THEN not_sym, of 1])

lemma a1_neq_0[simp]:"(1::ant)  0"
by (simp only:an_1[THEN sym], simp only:an_0[THEN sym],
    subst aneq_natneq[of 1 0], simp)

lemma a1_poss[simp]:"(0::ant) < 1"
by (cut_tac zposs_aposss[of 1], simp)

lemma a_p1_gt[simp]:"a  ; a  -   a < a + 1"
apply (cut_tac aadd_poss_less[of a 1],
       simp add:aadd_commute, assumption+) 
apply simp
done

lemma (in Corps) vpr_pow_inter_zero:"valuation K v  
      ( {I. n. I = (vp K v)(Vr K v) (an n)}) = {𝟬}"
apply (frule Vr_ring[of v], frule vp_ideal[of v])
apply (rule equalityI) 
defer
 apply (rule subsetI)
 apply simp
 apply (rule allI, rule impI, erule exE, simp)
 apply (cut_tac n = "an n" in vp_apow_ideal[of v], assumption+)
 apply simp
 apply (cut_tac I = "(vp K v) (Vr K v) (an n)" in  Ring.ideal_zero[of "Vr K v"],
        assumption+)
 apply (simp add:Vr_0_f_0)

apply (rule subsetI, simp) 
 apply (rule contrapos_pp, simp+)
 apply (subgoal_tac "x  vp K v")
 prefer 2 
 apply (drule_tac x = "vp K v (Vr K v) (an 1)" in spec)
 apply (subgoal_tac "n. vp K v (Vr K v) (an (Suc 0)) = vp K v (Vr K v) (an n)", 
        simp,
        thin_tac " n. vp K v (Vr K v) (an (Suc 0)) = vp K v (Vr K v) (an n)")
 apply (simp add:r_apow_def an_def) 
 apply (simp only:na_1)
  apply (simp only:Ring.idealpow_1_self[of "Vr K v" "vp K v"])

  apply blast

apply (frule n_val_valuation[of v])

apply (frule_tac x = x in val_nonzero_z[of "n_val K v"],
       frule_tac h = x in Ring.ideal_subset[of "Vr K v" "vp K v"],
       assumption+,
       simp add:Vr_mem_f_mem, assumption+) apply (
       frule_tac h = x in Ring.ideal_subset[of "Vr K v" "vp K v"],
       simp add:Vr_mem_f_mem, assumption+)
apply (cut_tac x = x in val_pos_mem_Vr[of v], assumption) apply(
       simp add:Vr_mem_f_mem, simp) 
       apply (frule_tac x = x in val_pos_n_val_pos[of v],
       simp add:Vr_mem_f_mem, simp)
apply (cut_tac x = "n_val K v x" and y = 1 in aadd_pos_poss, assumption+,
       simp) apply (frule_tac y = "n_val K v x + 1" in aless_imp_le[of 0])
apply (cut_tac x1 = x and n1 = "(n_val K v x) + 1" in n_val_n_pow[THEN sym, 
       of v], assumption+) 
apply (drule_tac a = "vp K v (Vr K v) (n_val K v x + 1)" in forall_spec)
apply (erule exE, simp)
apply (simp only:ant_1[THEN sym] a_zpz,
       cut_tac z = "z + 1" in z_neq_inf)
 apply (subst an_na[THEN sym], assumption+, blast)
 apply simp
 apply (cut_tac a = "n_val K v x" in a_p1_gt)
 apply (erule exE, simp only:ant_1[THEN sym], simp only:a_zpz z_neq_inf)
 apply (cut_tac i = "z + 1" and j = z in ale_zle, simp)
 apply (erule exE, simp add:z_neq_minf)
 apply (cut_tac y1 = "n_val K v x" and x1 = "n_val K v x + 1" in 
        aneg_le[THEN sym], simp)
done 

lemma (in Corps) limit_diff_n_val:"b  carrier K; j. f j  carrier K; 
      valuation K v   (limK v f b) = (N. M. n. M < n  
       (an N)  (n_val K v ((f n) ± (-a b))))" 
apply (rule iffI)
apply (rule allI)
apply (simp add:limit_def) apply (rotate_tac -1)
 apply (drule_tac x = N in spec)
 apply (erule exE)
apply (subgoal_tac "n>M. (an N)  (n_val K v (f n ± (-a b)))")
apply blast
 apply (rule allI, rule impI) apply (rotate_tac -2)
 apply (drule_tac x = n in spec, simp) 
 apply (rule n_value_x_1[of v], assumption+,
        simp add:an_nat_pos, assumption)

apply (simp add:limit_def)
 apply (rule allI, rotate_tac -1, drule_tac x = N in spec)

 apply (erule exE)
 apply (subgoal_tac "n>M. f n ± (-a b)  vp K v (Vr K v) (an N)")
 apply blast
apply (rule allI, rule impI)
apply (rotate_tac -2, drule_tac x = n in spec, simp)
 apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"])
 apply (rule_tac x = "f n ± -a b" and n = "an N" in n_value_x_2[of "v"],
        assumption+) 
 apply (subst val_pos_mem_Vr[THEN sym, of "v"], assumption+)
 apply (drule_tac x = n in spec)
 apply (rule aGroup.ag_pOp_closed[of "K"], assumption+)
 apply (simp add:aGroup.ag_mOp_closed)
 apply (subst val_pos_n_val_pos[of  "v"], assumption+)
 apply (rule aGroup.ag_pOp_closed, assumption+) apply simp
 apply (simp add:aGroup.ag_mOp_closed)
 apply (rule_tac j = "an N" and k = "n_val K v ( f n ± -a b)" in 
        ale_trans[of "0"], simp, assumption+)   
        apply simp 
done

lemma (in Corps) an_na_Lv:"valuation K v  an (na (Lv K v)) = Lv K v" 
apply (frule Lv_pos[of "v"])
apply (frule aless_imp_le[of "0" "Lv K v"])
apply (frule apos_neq_minf[of "Lv K v"])
apply (frule Lv_z[of "v"], erule exE)
apply (rule an_na)
 apply (rule contrapos_pp, simp+)
done

lemma (in Corps) limit_diff_val:"b  carrier K; j. f j  carrier K; 
      valuation K v   (limK v f b) = (N. M. n. M < n  
             (an N)  (v ((f n) ± (-a b))))" 
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       simp add:limit_diff_n_val[of "b" "f" "v"])
apply (rule iffI)
 apply (rule allI,
   rotate_tac -1, drule_tac x = N in spec, erule exE) 
 apply (subgoal_tac "n > M. an N  v( f n ± -a b)", blast)
 apply (rule allI, rule impI)
 apply (drule_tac x = n in spec,
        drule_tac x = n in spec, simp) 
 apply (frule aGroup.ag_mOp_closed[of "K" "b"], assumption+,
     frule_tac x = "f n" and y = "-a b" in aGroup.ag_pOp_closed, assumption+)
 apply (frule_tac x = "f n ± -a b" in n_val_le_val[of "v"], 
         assumption+)
 apply (cut_tac n = N in an_nat_pos)
 apply (frule_tac j = "an N" and k = "n_val K v ( f n ± -a b)" in 
                   ale_trans[of "0"], assumption+)
 apply (subst val_pos_n_val_pos, assumption+)
 apply (rule_tac i = "an N" and j = "n_val K v ( f n ± -a b)" and 
        k = "v ( f n ± -a b)" in ale_trans, assumption+)
 apply (rule allI)
 apply (rotate_tac 3, drule_tac x = "N * (na (Lv K v))" in spec)
 apply (erule exE)
 apply (subgoal_tac "n. M < n  (an N)  n_val K v (f n ± -a b)", blast)
 apply (rule allI, rule impI)
 apply (rotate_tac -2, drule_tac x = n in spec, simp)

  apply (drule_tac x = n in spec)
  apply (frule aGroup.ag_mOp_closed[of "K" "b"], assumption+,
      frule_tac x = "f n" and y = "-a b" in aGroup.ag_pOp_closed, assumption+)
 apply (cut_tac n = "N * na (Lv K v)" in an_nat_pos)
 apply (frule_tac i = 0 and j = "an (N * na (Lv K v))" and 
                  k = "v ( f n ± -a b)" in ale_trans, assumption+)
 apply (simp add:amult_an_an, simp add:an_na_Lv)
 apply (frule Lv_pos[of "v"])
 apply (frule_tac x1 = "f n ± -a b" in n_val[THEN sym, of v], 
        assumption+, simp)
 apply (frule Lv_z[of v], erule exE, simp)
 apply (simp add:amult_pos_mono_r)
done

text‹uniqueness of the limit is derived from vp_pow_inter_zero›
lemma (in Corps) limit_unique:"b  carrier K; j. f j  carrier K; 
      valuation K v;  c  carrier K; limK v f b; limK v f c   b = c" 
apply (rule contrapos_pp, simp+, simp add:limit_def,
       cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       simp add:aGroup.ag_neq_diffnonzero[of "K" "b" "c"], 
       frule vpr_pow_inter_zero[THEN sym, of v], 
       frule noneq_not_in_singleton[of "b ± -a c" "𝟬"])
apply simp
apply (rotate_tac -1, erule exE, erule conjE)
apply (erule exE, simp, thin_tac "x = (vp K v)(Vr K v) (an n)")
apply (rotate_tac 3, drule_tac x = n in spec,
       erule exE,
       drule_tac x = n in spec,
       erule exE)
apply (rename_tac x N M1 M2)
apply (subgoal_tac "M1 < Suc (max M1 M2)",
       subgoal_tac "M2 < Suc (max M1 M2)",
       drule_tac x = "Suc (max M1 M2)" in spec,
       drule_tac x = "Suc (max M1 M2)" in spec,
       drule_tac x = "Suc (max M1 M2)" in spec)
 apply simp

(* We see (f (Suc (max xb xc)) +K -K b) +K (-K (f (Suc (max xb xc)) +K -K c)) ∈ vpr K G a i v ♢Vr K G a i v xa" *) 
 apply (frule_tac n = "an N" in vp_apow_ideal[of "v"], 
       frule_tac x = "f (Suc (max M1 M2)) ± -a b" and N = "an N" in 
       mem_vp_apow_mem_Vr[of "v"], simp,
       frule Vr_ring[of "v"],  simp, simp)
      
apply (frule Vr_ring[of "v"], 
       frule_tac I = "vp K v(Vr K v) (an N)" and x = "f (Suc (max M1 M2)) ± -a b"
       in Ring.ideal_inv1_closed[of "Vr K v"], assumption+)
 (** mOp of Vring and that of K is the same **)
apply (frule_tac I = "vp K v(Vr K v) (an N)" and h = "f (Suc (max M1 M2)) ± -a b"
 in Ring.ideal_subset[of "Vr K v"], assumption+)
 apply (simp add:Vr_mOp_f_mOp,
        cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
        frule aGroup.ag_mOp_closed[of "K" "b"], assumption+,
        simp add:aGroup.ag_p_inv, simp add:aGroup.ag_inv_inv)
 (** addition of  -K f (Suc (max xb xc)) +K b  and f (Suc (max xb xc)) +K -K c
    is included in vpr K G a i v ♢(Vr K G a i v) xa **)
 apply (frule_tac  I = "vp K v(Vr K v) (an N)" and x = 
 "-a (f (Suc (max M1 M2))) ± b " and y = "f (Suc (max M1 M2)) ± (-a c)" in 
  Ring.ideal_pOp_closed[of "Vr K v"], assumption+)
 apply (frule_tac x = "f (Suc (max M1 M2)) ± -a c" and N = "an N" in 
        mem_vp_apow_mem_Vr[of v], simp, assumption,
        frule_tac x = "-a (f (Suc (max M1 M2))) ± b" and N = "an N" in 
        mem_vp_apow_mem_Vr[of "v"], simp,
        simp add:Vr_pOp_f_pOp, simp add:Vr_pOp_f_pOp,
   frule aGroup.ag_mOp_closed[of "K" "c"], assumption+,
   frule_tac x = "f (Suc (max M1 M2))" in aGroup.ag_mOp_closed[of "K"], 
      assumption+,
   frule_tac x = "f (Suc (max M1 M2))" and y = "-a c" in 
      aGroup.ag_pOp_closed[of "K"], assumption+) 

apply (simp add:aGroup.ag_pOp_assoc[of "K" _ "b" _],
       simp add:aGroup.ag_pOp_assoc[THEN sym, of "K" "b" _ "-a c"],
       simp add:aGroup.ag_pOp_commute[of "K" "b"],
       simp add:aGroup.ag_pOp_assoc[of "K" _ "b" "-a c"],
       frule aGroup.ag_pOp_closed[of "K" "b" "-a c"], assumption+,
       simp add:aGroup.ag_pOp_assoc[THEN sym, of "K" _ _ "b ± -a c"],
       simp add:aGroup.ag_l_inv1, simp add:aGroup.ag_l_zero)
apply (simp add:aGroup.ag_pOp_commute[of "K" _ "b"])
apply arith apply arith
done


(** The following lemma will be used to prove lemma limit_t. This lemma and
 them next lemma show that the valuation v is continuous (see lemma 
 n_val **) 
lemma (in Corps) limit_n_val:"b  carrier K; b  𝟬; valuation K v; 
       j. f j  carrier K; limK v f b 
       N. (m. N < m  (n_val K v) (f m) = (n_val K v) b)"
apply (simp add:limit_def)
apply (frule n_val_valuation[of "v"])
apply (frule val_nonzero_z[of "n_val K v" "b"], assumption+, erule exE,
       rename_tac L)
apply (rotate_tac -3, drule_tac x = "nat (abs L + 1)" in spec)
apply (erule exE, rename_tac M)

    (* |L| + 1 ≤ (n_val K v ( f n +K -K b)). *) 
 apply (subgoal_tac "n. M < n  n_val K v (f n) = n_val K v b", blast)
 apply (rule allI, rule impI) 
 apply (rotate_tac -2, 
        drule_tac x = n in spec,
        simp)
apply (frule_tac x = "f n ± -a b" and n = "an (nat (¦L¦ + 1))" in 
       n_value_x_1[of "v"],
       thin_tac "f n ± -a b  vp K v(Vr K v) (an (nat (¦L¦ + 1)))")
apply (simp add:an_def) 
 apply (simp add: zpos_apos [symmetric])
 apply assumption

 apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"])
 apply (frule aGroup.ag_mOp_closed[of "K" "b"], assumption+)
 
 apply (drule_tac x = n in spec, 
        frule_tac x = "f n" in aGroup.ag_pOp_closed[of "K" _ "-a b"], 
        assumption+,  
        frule_tac x = "b" and y = "(f n) ± (-a b)" in value_less_eq[of 
        "n_val K v"], assumption+)
 apply simp 
 apply (rule_tac x = "ant L" and y = "an (nat (¦L¦ + 1))" and 
        z = "n_val K v ( f n ± -a b)" in aless_le_trans)
 apply (subst an_def)
 apply (subst aless_zless) apply arith apply assumption+
 apply (simp add:aGroup.ag_pOp_commute[of "K" "b"])
 apply (simp add:aGroup.ag_pOp_assoc) apply (simp add:aGroup.ag_l_inv1)
 apply (simp add:aGroup.ag_r_zero)
done 

lemma (in Corps) limit_val:"b  carrier K; b  𝟬; j. f j  carrier K; 
      valuation K v; limK v f b  N. (n. N < n  v (f n) = v b)"
apply (frule limit_n_val[of "b" "v" "f"], assumption+)
 apply (erule exE)
 apply (subgoal_tac "m. N < m  v (f m) = v b")
 apply blast
apply (rule allI, rule impI)
 apply (drule_tac x = m in spec)
 apply (drule_tac x = m in spec)
  apply simp
 apply (frule Lv_pos[of "v"])
 apply (simp add:n_val[THEN sym, of "v"])
done

lemma (in Corps) limit_val_infinity:"valuation K v; j. f j  carrier K; 
      limK v f 𝟬  N.(M. (m. M < m  (an N)  (n_val K v (f m))))"
apply (simp add:limit_def)
 apply (rule allI)
 apply (drule_tac x = N in spec, 
        erule exE)
       
 apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
        simp only:aGroup.ag_inv_zero[of "K"], simp only:aGroup.ag_r_zero)
apply (subgoal_tac "n. M < n  an N  n_val K v (f n)", blast)

 apply (rule allI, rule impI)
 apply (drule_tac x = n in spec,
        drule_tac x = n in spec, simp)
 apply (simp add:n_value_x_1)
done

lemma (in Corps) not_limit_zero:"valuation K v; j. f j  carrier K; 
      ¬ (limK v f 𝟬)  N.(M. (m. (M < m)  
                                    ((n_val K v) (f m)) < (an N)))"
apply (simp add:limit_def)
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"])
apply (simp add:aGroup.ag_inv_zero aGroup.ag_r_zero)
apply (erule exE)
 apply (case_tac "N = 0", simp add:r_apow_def) 
 apply (subgoal_tac "M. n. M < n  n_val K v (f n) < (an 0)") apply blast
 apply (rule allI, 
        rotate_tac 4, frule_tac x = M in spec,
        erule exE, erule conjE)
 apply (frule_tac x1 = "f n" in val_pos_mem_Vr[THEN sym, of "v"]) apply simp 
 apply simp
 apply (frule_tac x = "f n" in val_pos_n_val_pos[of "v"])
 apply simp apply simp apply (thin_tac "¬ 0  v (f n)")
 apply (simp add:aneg_le) apply blast

apply (simp)
 apply (subgoal_tac "n. ((f n)  vp K v (Vr K v) (an N)) = 
                                ((an N)  n_val K v (f n))")
 apply simp
 apply (thin_tac "n. (f n  vp K v (Vr K v) (an N)) = (an N  n_val K v (f n))")
 apply (simp add:aneg_le) apply blast

apply (rule allI)
 apply (thin_tac "M. n. M < n  f n  vp K v (Vr K v) (an N)")
 apply (rule iffI)
 apply (frule_tac x1 = "f n" and n1 = "an N" in n_val_n_pow[THEN sym, of v])
 apply (rule_tac N = "an N" and x = "f n" in mem_vp_apow_mem_Vr[of v],
        assumption+, simp, assumption, simp, simp)
 apply (frule_tac x = "f n" and n = "an N" in n_val_n_pow[of "v"])
 apply (frule_tac x1 = "f n" in val_pos_mem_Vr[THEN sym, of "v"])
 apply simp
 apply (cut_tac n = N in an_nat_pos) 
 apply (frule_tac j = "an N" and k = "n_val K v (f n)" in ale_trans[of "0"],
         assumption+)
 apply (frule_tac x1 = "f n" in val_pos_n_val_pos[THEN sym, of "v"]) 
 apply simp+ 
done

lemma (in Corps) limit_p:"valuation K v; j. f j   carrier K; 
   j. g j  carrier K; b  carrier K; c  carrier K; limK v f b; limK v g c
    limK v (λj. (f j) ± (g j)) (b ± c)"
apply (simp add:limit_def)
 apply (rule allI) apply (rotate_tac 3,
       drule_tac x = N in spec,
       drule_tac x = N in spec,
       (erule exE)+) 
 apply (frule_tac x = M and y = Ma in two_inequalities, simp,
        subgoal_tac "n > (max M  Ma). (f n) ± (g n) ± -a (b ± c)
         (vp K v)(Vr K v) (an N)")
 apply (thin_tac "n. Ma < n  
                     g n ± -a c  (vp K v)(Vr K v) (an N)",
        thin_tac "n. M < n  
                      f n ± -a b (vp K v)(Vr K v) (an N)", blast)
 apply (frule Vr_ring[of v], 
        frule_tac n = "an N" in vp_apow_ideal[of v])
apply simp 
 apply (rule allI, rule impI)
 apply (thin_tac "n>M. f n ± -a b  vp K v (Vr K v) (an N)",
        thin_tac "n>Ma. g n ± -a c  vp K v (Vr K v) (an N)",
        frule_tac I = "vp K v(Vr K v) (an N)" and x = "f n ± -a b" 
        and y = "g n ± -a c" in Ring.ideal_pOp_closed[of "Vr K v"], 
        assumption+, simp, simp) 
apply (frule_tac I = "vp K v(Vr K v) (an N)" and h = "f n ± -a b" 
        in Ring.ideal_subset[of "Vr K v"], assumption+, simp,
        frule_tac I = "vp K v(Vr K v) (an N)" and h = "g n ± -a c" in
                   Ring.ideal_subset[of "Vr K v"], assumption+, simp)
 apply (simp add:Vr_pOp_f_pOp) 
 apply (thin_tac "f n ± -a b  carrier (Vr K v)",
        thin_tac "g n ± -a c  carrier (Vr K v)")

 apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
        frule aGroup.ag_mOp_closed[of "K" "b"], assumption+,
        frule aGroup.ag_mOp_closed[of "K" "c"], assumption+,
        frule_tac a = "f n" and b = "-a b" and c = "g n" and d = "-a c" in 
                  aGroup.ag_add4_rel[of "K"], simp+)
 apply (simp add:aGroup.ag_p_inv[THEN sym]) 
done

lemma (in Corps) Abs_ant_abs[simp]:"Abs (ant z) = ant (abs z)"
apply (simp add:Abs_def, simp add:aminus)
apply (simp only:ant_0[THEN sym], simp only:aless_zless)
apply (simp add:zabs_def)
done

lemma (in Corps) limit_t_nonzero:"valuation K v; (j::nat). (f j)  carrier K; (j::nat). g j  carrier K;  b  carrier K; c  carrier K; b  𝟬; c  𝟬;
 limK v f b; limK v g c  limK v (λj. (f j) r (g j)) (b r c)"
apply (cut_tac field_is_ring, simp add:limit_def, rule allI) 
 apply (subgoal_tac "j. (f j) r (g j) ± -a (b r c) = 
 ((f j) r (g j) ± (f j) r (-a c)) ± ((f j) r c ± -a (b r c))", simp,
 thin_tac "j. f j r g j ± -a b r c =
             f j r g j ± f j r (-a c) ± (f j r c ± -a b r c)")
 apply (frule limit_n_val[of  "b" "v" "f"], assumption+,
        simp add:limit_def)
 apply (frule n_val_valuation[of "v"])
 apply (frule val_nonzero_z[of "n_val K v" "b"], assumption+, 
        rotate_tac -1, erule exE,
        frule val_nonzero_z[of "n_val K v" "c"], assumption+,
        rotate_tac -1, erule exE, rename_tac N bz cz)
 apply (rotate_tac 5, 
  drule_tac x = "N + nat (abs cz)" in spec, 
  drule_tac x = "N + nat (abs bz)" in spec)
  apply (erule exE)+ 
  apply (rename_tac N bz cz M M1 M2)
(** three inequalities together **)
apply (subgoal_tac "n. (max (max M1 M2) M) < n 
 (f n) r (g n) ± (f n) r (-a c) ± ((f n) r c ± (-a (b r c)))
                   vp K v (Vr K v) (an N)",  blast)
apply (rule allI, rule impI) apply (simp, (erule conjE)+) 
 apply (rotate_tac 11, drule_tac x = n in spec,
      drule_tac x = n in spec, simp,
      drule_tac x = n in spec, simp)
 apply (frule_tac b = "g n ± -a c" and n = "an N" and x = "f n" in 
        convergenceTr1[of v])
 apply simp apply simp apply (simp add:an_def a_zpz[THEN sym]) apply simp
 apply (frule_tac b = "f n ± -a b" and n = "an N" in convergenceTr1[of  
  "v" "c"], assumption+, simp) apply (simp add:an_def)
   apply (simp add:a_zpz[THEN sym]) apply simp

 apply (drule_tac x = n in spec, 
        drule_tac x = n in spec)
 apply (simp add:Ring.ring_inv1_1[of "K" "b" "c"],
        cut_tac Ring.ring_is_ag, frule aGroup.ag_mOp_closed[of "K" "c"], 
        assumption+,
        simp add:Ring.ring_distrib1[THEN sym],
        frule aGroup.ag_mOp_closed[of "K" "b"], assumption+,
        simp add:Ring.ring_distrib2[THEN sym],
        subst Ring.ring_tOp_commute[of "K" _ "c"], assumption+,
        rule aGroup.ag_pOp_closed, assumption+) 
apply (cut_tac n = N in an_nat_pos)
apply (frule_tac n = "an N" in vp_apow_ideal[of "v"], assumption+)
apply (frule Vr_ring[of "v"]) 

apply (frule_tac x = "(f n) r (g n ± -a c)" and y = "c r (f n ± -a b)"
   and I = "vp K v (Vr K v) (an N)" in Ring.ideal_pOp_closed[of "Vr K v"], 
   assumption+)
apply (frule_tac R = "Vr K v" and I = "vp K v (Vr K v) (an N)" and 
       h = "(f n) r (g n ± -a c)" in Ring.ideal_subset, assumption+,
       frule_tac R = "Vr K v" and I = "vp K v (Vr K v) (an N)" and 
       h = "c r (f n ± -a b)" in Ring.ideal_subset, assumption+) 
apply (simp add:Vr_pOp_f_pOp, assumption+)
apply (rule allI)
 apply (thin_tac "N. M. n>M. f n ± -a b  vp K v (Vr K v) (an N)",
        thin_tac "N. M. n>M. g n ± -a c  vp K v (Vr K v) (an N)")
 apply (drule_tac x = j in spec,
        drule_tac x = j in spec,
        cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule_tac x = "f j" and y = "g j" in Ring.ring_tOp_closed, assumption+,
       frule_tac x = "b" and y = "c" in Ring.ring_tOp_closed, assumption+,
       frule_tac x = "f j" and y = "c" in Ring.ring_tOp_closed, assumption+,
       frule_tac x = c in aGroup.ag_mOp_closed[of "K"], assumption+,
       frule_tac x = "f j" and y = "-a c" in Ring.ring_tOp_closed, assumption+,
       frule_tac x = "b r c" in aGroup.ag_mOp_closed[of "K"], assumption+)
 apply (subst aGroup.pOp_assocTr41[THEN sym, of "K"], assumption+,
        subst aGroup.pOp_assocTr42[of "K"], assumption+,
        subst Ring.ring_distrib1[THEN sym, of "K"], assumption+)
 apply (simp add:aGroup.ag_l_inv1, simp add:Ring.ring_times_x_0, 
        simp add:aGroup.ag_r_zero)
done

lemma an_npn[simp]:"an (n + m) = an n + an m"
by (simp add:an_def a_zpz) (** move **) 

lemma Abs_noninf:"a  -  a    Abs a  "
by (cut_tac mem_ant[of "a"], simp, erule exE, simp add:Abs_def,
       simp add:aminus)

lemma (in Corps) limit_t_zero:"c  carrier K; valuation K v; 
      (j::nat). f j  carrier K; (j::nat). g j  carrier K;
      limK v f 𝟬; limK v g c  limK v (λj. (f j) r (g j)) 𝟬"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"], 
       simp add:limit_def, simp add:aGroup.ag_inv_zero, simp add:aGroup.ag_r_zero)
apply (subgoal_tac "j. (f j) r (g j)  carrier K",
       simp add:aGroup.ag_r_zero)
 prefer 2 apply (rule allI, simp add:Ring.ring_tOp_closed)
apply (case_tac "c = 𝟬K")
 apply (simp add:aGroup.ag_inv_zero, simp add:aGroup.ag_r_zero)
 apply (rule allI,
        rotate_tac 4,
        drule_tac x = N in spec,
        drule_tac x = N in spec, (erule exE)+,
        rename_tac N M1 M2)
 apply (subgoal_tac "n>(max M1 M2). (f n) r (g n)  (vp K v)(Vr K v) (an N)", 
        blast) 
 apply (rule allI, rule impI)
 apply (drule_tac x = M1 and y = M2 in two_inequalities, assumption+,
        thin_tac "n>M2. g n  vp K v (Vr K v) (an N)")
apply (thin_tac "j. f j r g j  carrier K",
       thin_tac "j. f j  carrier K",
       thin_tac "j. g j  carrier K",
       drule_tac x = n in spec, simp, erule conjE,
       erule conjE,
       frule Vr_ring[of v])
 apply (cut_tac n = N in an_nat_pos) 
 apply (frule_tac x = "f n" in mem_vp_apow_mem_Vr[of  "v"], assumption+,
        frule_tac x = "g n" in mem_vp_apow_mem_Vr[of  "v"], assumption+,
       frule_tac n = "an N" in vp_apow_ideal[of  "v"], assumption+)
 apply (frule_tac I = "vp K v(Vr K v) (an N)" and x = "g n" and 
        r = "f n" in Ring.ideal_ring_multiple[of "Vr K v"], assumption+,
        simp add:Vr_tOp_f_tOp)


 (** case c ≠ 0K **)
 apply (rule allI)
 apply (subgoal_tac "j. (f j) r (g j) = 
        (f j) r ((g j) ± (-a c)) ± (f j) r c", simp,
        thin_tac "j. (f j) r (g j) = 
        (f j) r ((g j) ± (-a c)) ± (f j) r c",
        thin_tac "j.  (f j) r ( g j ± -a c) ± (f j) r c  carrier K")
apply (rotate_tac 4,
       drule_tac x = "N + na (Abs (n_val K v c))" in  spec,
       drule_tac x = N in spec)
 apply (erule exE)+ apply (rename_tac N M1 M2)
apply (subgoal_tac "n. (max M1 M2) < n  (f n) r (g n ± -a c) ± 
                     (f n) r  c  vp K v(Vr K v) (an N)", blast)
apply (rule allI, rule impI, simp, erule conjE,
      drule_tac x = n in spec,
      drule_tac x = n in spec,
      drule_tac x = n in spec) 
apply (frule n_val_valuation[of "v"])
apply (frule value_in_aug_inf[of "n_val K v" "c"], assumption+, 
       simp add:aug_inf_def)
apply (frule val_nonzero_noninf[of "n_val K v" "c"], assumption+)
apply (cut_tac Abs_noninf[of "n_val K v c"])
apply (cut_tac Abs_pos[of "n_val K v c"]) apply (simp add:an_na)

apply (drule_tac x = n in spec, simp)
 apply (frule_tac b = "f n" and n = "an N" in convergenceTr1[of 
                                   "v" "c"], assumption+)
 apply simp

apply (frule_tac x = "f n" and N = "an N + Abs (n_val K v c)" in 
       mem_vp_apow_mem_Vr[of "v"], 
       frule_tac n = "an N" in vp_apow_ideal[of "v"])
      apply simp
apply (rule_tac x = "an N" and y = "Abs (n_val K v c)" in aadd_two_pos)
    apply simp apply (simp add:Abs_pos) apply assumption
   
apply (frule_tac x = "g n ± (-a c)" and N = "an N" in mem_vp_apow_mem_Vr[of 
       "v"], simp, assumption+) apply (
       frule_tac x = "c r (f n)" and N = "an N" in mem_vp_apow_mem_Vr[of 
       "v"], simp)  apply simp  
apply (simp add:Ring.ring_tOp_commute[of "K" "c"]) apply (
       frule Vr_ring[of  "v"], 
       frule_tac I = "(vp K v)(Vr K v) (an N)" and x = "g n ± (-a c)" 
       and r = "f n" in Ring.ideal_ring_multiple[of "Vr K v"]) 
apply (simp add:vp_apow_ideal) apply assumption+
apply (frule_tac I = "vp K v(Vr K v) (an N)" and 
       x = "(f n) r (g n ± -a c)" and y = "(f n) r c" in 
                      Ring.ideal_pOp_closed[of "Vr K v"])
    apply (simp add:vp_apow_ideal)
 apply (simp add:Vr_tOp_f_tOp,  assumption)
 apply (simp add:Vr_tOp_f_tOp Vr_pOp_f_pOp,
       frule_tac x = "(f n) r (g n ± -a c)" and N = "an N" in mem_vp_apow_mem_Vr[of "v"], simp add:Vr_pOp_f_pOp, assumption+)
 apply (frule_tac N = "an N" and x = "(f n) r c" in mem_vp_apow_mem_Vr[of 
        "v"]) apply simp apply assumption
 apply (simp add:Vr_pOp_f_pOp) apply simp

 apply (thin_tac "N. M. n>M. f n  vp K v (Vr K v) (an N)",
        thin_tac "N. M. n>M. g n ± -a c  vp K v (Vr K v) (an N)",
        rule allI)
 apply (drule_tac x = j in spec, 
    drule_tac x = j in spec,
    drule_tac x = j in spec,
    frule  aGroup.ag_mOp_closed[of "K" "c"], assumption+,
    frule_tac x = "f j" in Ring.ring_tOp_closed[of "K" _ "c"], assumption+,
    frule_tac x = "f j" in Ring.ring_tOp_closed[of "K" _ "-a c"], assumption+)
 apply (simp add:Ring.ring_distrib1, simp add:aGroup.ag_pOp_assoc, 
        simp add:Ring.ring_distrib1[THEN sym],
        simp add:aGroup.ag_l_inv1, simp add:Ring.ring_times_x_0, 
        simp add:aGroup.ag_r_zero)
done

lemma (in Corps) limit_minus:"valuation K v; j. f j  carrier K; 
      b  carrier K; limK v f b  limK v (λj. (-a (f j))) (-a b)"
apply (simp add:limit_def)
 apply (rule allI,
       rotate_tac -1, frule_tac x = N in spec,
        thin_tac "N. M. n. M < n   
                   f n ± -a b  (vp K v)(Vr K v) (an N)",
       erule exE,
       subgoal_tac "n. M < n  
           (-a (f n)) ± (-a (-a b))  (vp K v)(Vr K v) (an N)",
      blast) 
 apply (rule allI, rule impI,
        frule_tac x = n in spec,
        frule_tac x = n in spec, simp) 

apply (frule Vr_ring[of "v"],
       frule_tac n = "an N" in vp_apow_ideal[of "v"], simp)
apply (frule_tac x = "f n ± -a b" and N = "an N" in 
       mem_vp_apow_mem_Vr[of "v"], simp+,
       frule_tac I = "vp K v(Vr K v) (an N)" and x = "f n ± (-a b)" in 
       Ring.ideal_inv1_closed[of "Vr K v"], assumption+, simp) 
 apply (simp add:Vr_mOp_f_mOp) 
 apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
        frule aGroup.ag_mOp_closed[of "K" "b"], assumption+)
 apply (simp add:aGroup.ag_p_inv[of "K"])
done

lemma (in Corps) inv_diff:"x  carrier K; x  𝟬; y  carrier K; y  𝟬 
                (xK) ± (-a (yK)) = (xK) r ( yK) r (-a (x ± (-a y)))"
apply (cut_tac invf_closed1[of "x"], simp, erule conjE,
       cut_tac invf_closed1[of y], simp, erule conjE,
       cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule Ring.ring_tOp_closed[of "K" "xK" "yK"], assumption+,
       frule aGroup.ag_mOp_closed[of "K" "x"], assumption+,
       frule aGroup.ag_mOp_closed[of "K" "y"], assumption+,
       frule aGroup.ag_mOp_closed[of "K" "xK"], assumption+,
       frule aGroup.ag_mOp_closed[of "K" "yK"], assumption+,
       frule aGroup.ag_pOp_closed[of "K" "x" "-a y"], assumption+) 
                                    
apply (simp add:Ring.ring_inv1_2[THEN sym],
       simp only:Ring.ring_distrib1[of "K" "(xK) r (yK)" "x" "-a y"],
       simp only:Ring.ring_tOp_commute[of "K" _ x],
       simp only:Ring.ring_inv1_2[THEN sym, of "K"], 
       simp only:Ring.ring_tOp_assoc[THEN sym],
       simp only:Ring.ring_tOp_commute[of "K" "x"],
       cut_tac linvf[of  "x"], simp+,
       simp add:Ring.ring_l_one, simp only:Ring.ring_tOp_assoc,
       cut_tac linvf[of "y"], simp+, 
       simp only:Ring.ring_r_one) 
apply (simp add:aGroup.ag_p_inv[of "K"], simp add:aGroup.ag_inv_inv,
       rule aGroup.ag_pOp_commute[of "K" "xK" "-a yK"], assumption+)
apply simp+
done

lemma times2plus:"(2::nat)*n = n + n"
by simp

lemma (in Corps) limit_inv:"valuation K v; j. f j  carrier K; 
      b  carrier K; b  𝟬; limK v f b  
           limK v (λj. if (f j) = 𝟬 then 𝟬 else (f j)K) (bK)"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"])
apply (frule limit_n_val[of "b" "v" "f"], assumption+) 
apply (subst limit_def)
 apply (rule allI, erule exE)
 apply (subgoal_tac "m>Na. f m  𝟬") 
 prefer 2
 apply (rule allI, rule impI, rotate_tac -2,
        drule_tac x = m in spec, simp)
 apply (frule n_val_valuation[of v]) 
 apply (frule val_nonzero_noninf[of "n_val K v" b], assumption+)
 apply (rule contrapos_pp, simp+, simp add:value_of_zero)
 apply (unfold limit_def)
  apply (rotate_tac 2,
         frule_tac x = "N + 2*(na (Abs (n_val K v b)))" in 
         spec)
  apply (erule exE)
  apply (subgoal_tac "n>(max Na M).
          (if f n = 𝟬 then 𝟬 else f nK) ± -a bK  vp K v(Vr K v) (an N)", 
         blast) 
  apply (rule allI, rule impI)
  apply (cut_tac x = "Na" and y = "max Na M" and z = n
         in le_less_trans)
  apply simp+
  apply (thin_tac "N. M. n>M. f n ± -a b  vp K v (Vr K v) (an N)")
 apply (drule_tac x = n in spec,
        drule_tac x = n in spec,
        drule_tac x = n in spec,
        drule_tac x = n in spec, simp)
 apply (subst inv_diff, assumption+)
 apply (cut_tac x = "f n" in invf_closed1, simp,
        cut_tac x = b in invf_closed1, simp, simp, (erule conjE)+)
(* apply (frule field_is_idom[of "K"], frule field_iOp_closed[of "K" "b"], 
                                                 simp, simp, erule conjE,
        frule idom_tOp_nonzeros [of "K" "b‐K" "b‐K"], assumption+) *)
 apply (frule_tac n = "an N + an (2 * na (Abs (n_val K v b)))" and 
        x = "f n ± -a b" in n_value_x_1[of v])
 apply (simp only:an_npn[THEN sym], rule an_nat_pos) 
 apply assumption
 apply (rule_tac x = "f nK r bK r (-a (f n ± -a b))" and v = v and 
        n = "an N" in n_value_x_2, assumption+)
 apply (frule n_val_valuation[of v])
 apply (subst val_pos_mem_Vr[THEN sym, of "v"], assumption+)
  apply (rule Ring.ring_tOp_closed, assumption+)+
  apply (rule aGroup.ag_mOp_closed, assumption)
  apply (rule aGroup.ag_pOp_closed, assumption+,
         rule aGroup.ag_mOp_closed, assumption+)
  apply (subst val_pos_n_val_pos[of v], assumption+,
         rule Ring.ring_tOp_closed, assumption+,
         rule Ring.ring_tOp_closed, assumption+,
         rule aGroup.ag_mOp_closed, assumption+,
         rule aGroup.ag_pOp_closed, assumption+,
         rule aGroup.ag_mOp_closed, assumption+)
  apply (subst val_t2p[of "n_val K v"], assumption+,
         rule Ring.ring_tOp_closed, assumption+,
         rule aGroup.ag_mOp_closed, assumption+,
         rule aGroup.ag_pOp_closed, assumption+,
         rule aGroup.ag_mOp_closed, assumption+,
         subst val_minus_eq[of "n_val K v"], assumption+,
          (rule aGroup.ag_pOp_closed, assumption+),
          (rule aGroup.ag_mOp_closed, assumption+))
  apply (subst val_t2p[of "n_val K v"], assumption+)
  apply (simp add:value_of_inv)
  apply (frule_tac x = "an N + an (2 * na (Abs (n_val K v b)))" and y = "n_val K v (f n ± -a b)" and z = "- n_val K v b + - n_val K v b" in aadd_le_mono)
  apply (cut_tac z = "n_val K v b" in Abs_pos)
  apply (frule val_nonzero_z[of "n_val K v" b], assumption+, erule exE)
  apply (rotate_tac -1, drule sym, cut_tac z = z in z_neq_minf,
         cut_tac z = z in z_neq_inf, simp,
         cut_tac a = "(n_val K v b)" in Abs_noninf, simp)
  apply (simp only:times2plus an_npn, simp add:an_na)
  apply (rotate_tac -4, drule sym, simp)
  apply (thin_tac "f n ± -a b  vp K v (Vr K v) (an N + (ant ¦z¦ + ant ¦z¦))")
  apply (simp add:an_def, simp add:aminus, (simp add:a_zpz)+)
  apply (subst aadd_commute)
  apply (rule_tac i = 0 and j = "ant (int N + 2 * ¦z¦ - 2 * z)" and 
         k = "n_val K v (f n ± -a b) + ant (- (2 * z))" in ale_trans)
  apply (subst ant_0[THEN sym])
  apply (subst ale_zle, simp, assumption)

  apply (frule n_val_valuation[of v])
  apply (subst val_t2p[of "n_val K v"], assumption+)
  apply (rule Ring.ring_tOp_closed, assumption+)+
  apply (rule aGroup.ag_mOp_closed, assumption)
  apply (rule aGroup.ag_pOp_closed, assumption+,
         rule aGroup.ag_mOp_closed, assumption+)
  apply (subst val_t2p[of "n_val K v"], assumption+) 
  apply (subst val_minus_eq[of "n_val K v"], assumption+,
         rule aGroup.ag_pOp_closed, assumption+,
         rule aGroup.ag_mOp_closed, assumption+)

  apply (simp add:value_of_inv)
  apply (frule_tac x = "an N + an (2 * na (Abs (n_val K v b)))" and y = "n_val K v (f n ± -a b)" and z = "- n_val K v b + - n_val K v b" in aadd_le_mono)
  apply (cut_tac z = "n_val K v b" in Abs_pos)
  apply (frule val_nonzero_z[of "n_val K v" b], assumption+, erule exE)
  apply (rotate_tac -1, drule sym, cut_tac z = z in z_neq_minf,
         cut_tac z = z in z_neq_inf, simp,
         cut_tac a = "(n_val K v b)" in Abs_noninf, simp)
  apply (simp only:times2plus an_npn, simp add:an_na)
  apply (rotate_tac -4, drule sym, simp)
  apply (thin_tac "f n ± -a b  vp K v (Vr K v) (an N + (ant ¦z¦ + ant ¦z¦))")
  apply (simp add:an_def, simp add:aminus, (simp add:a_zpz)+)
  apply (subst aadd_commute)
  apply (rule_tac i = "ant (int N)" and j = "ant (int N + 2 * ¦z¦ - 2 * z)" 
        and k = "n_val K v (f n ± -a b) + ant (- (2 * z))" in ale_trans)
  apply (subst ale_zle, simp, assumption)
 
  apply simp
done

definition
  Cauchy_seq :: "[_ , 'b  ant, nat  'b]
            bool" ("(3Cauchy⇘ _ _ _)" [90,90,91]90) where
  "CauchyK v f  (n. (f n)  carrier K)  (
  N. M. (n m. M < n  M < m  
                ((f n) ±K (-aK (f m)))  (vp K v)(Vr K v) (an N)))"

definition
  v_complete :: "['b  ant, _]  bool"
                    ("(2Complete⇘_ _)"  [90,91]90) where
  "Completev K  (f. (CauchyK v f)  
                           (b. b  (carrier K)  limK v f b))"

lemma (in Corps) has_limit_Cauchy:"valuation K v; j. f j  carrier K; 
      b  carrier K; limK v f b  CauchyK v f" 
apply (simp add:Cauchy_seq_def)
apply (rule allI)
apply (simp add:limit_def)
 apply (rotate_tac -1)
 apply (drule_tac x = N in spec)
 apply (erule exE)
 apply (subgoal_tac "n m. M < n  M < m 
                        f n ± -a (f m)  vp K v(Vr K v) (an N)")
 apply blast
 apply ((rule allI)+, rule impI, erule conjE)
 apply (frule_tac x = n in spec,
        frule_tac x = m in spec,
        thin_tac "j. f j  carrier K",
        frule_tac x = n in spec,
        frule_tac x = m in spec,
        thin_tac "n. M < n   f n ± -a b  vp K v(Vr K v) (an N)",
        simp)
 apply (frule_tac n = "an N" in vp_apow_ideal[of v], simp)
 apply (frule Vr_ring[of "v"])
 apply (frule_tac x = "f m ± -a b" and I = "vp K v(Vr K v) (an N)" in 
           Ring.ideal_inv1_closed[of "Vr K v"], assumption+)
 apply (frule_tac h = "f m ± -a b" and I = "vp K v(Vr K v) (an N)" in 
           Ring.ideal_subset[of "Vr K v"], assumption+,
        frule_tac h = "f n ± -a b" and I = "vp K v(Vr K v) (an N)" in 
           Ring.ideal_subset[of "Vr K v"], assumption+)  
apply (frule_tac h = "-aVr K v (f m ± -a b)" and I = "vp K v(Vr K v) (an N)" in         Ring.ideal_subset[of "Vr K v"], assumption+,
       frule_tac h = "f n ± -a b" and I = "vp K v(Vr K v) (an N)" in 
        Ring.ideal_subset[of "Vr K v"], assumption+) 
apply (frule_tac I = "(vp K v) (Vr K v) (an N)" and x = "f n ± -a b" and
       y = "-a(Vr K v) (f m ± -a b)" in Ring.ideal_pOp_closed[of "Vr K v"],
       assumption+)
apply (simp add:Vr_pOp_f_pOp) apply (simp add:Vr_mOp_f_mOp)
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"])
 apply (frule aGroup.ag_mOp_closed[of "K" "b"], assumption+)
 apply (frule_tac x = "f m ± -a b" in Vr_mem_f_mem[of "v"], assumption+)
 apply (frule_tac x = "f m ± -a b" in aGroup.ag_mOp_closed[of "K"], 
         assumption+)
 apply (simp add:aGroup.ag_pOp_assoc)
 apply (simp add:aGroup.ag_pOp_commute[of "K" "-a b"])
 apply (simp add:aGroup.ag_p_inv[of "K"])
 apply (frule_tac x = "f m" in aGroup.ag_mOp_closed[of "K"], assumption+)
 apply (simp add:aGroup.ag_inv_inv)
 apply (simp add:aGroup.ag_pOp_assoc[of "K" _ "b" "-a b"])
 apply (simp add:aGroup.ag_r_inv1[of "K"], simp add:aGroup.ag_r_zero)
done

lemma (in Corps) no_limit_zero_Cauchy:"valuation K v; CauchyK v f;
    ¬ (limK v f 𝟬)  
 N M. (m. N < m   ((n_val K v) (f M))  = ((n_val K v) (f m)))"
apply (frule not_limit_zero[of "v" "f"], thin_tac "¬ lim K v f 𝟬")
apply (simp add:Cauchy_seq_def, assumption) apply (erule exE)
apply (rename_tac L)
apply (simp add:Cauchy_seq_def, erule conjE,
       rotate_tac -1,
       frule_tac x = L in spec, thin_tac "N. M. n m. 
       M < n  M < m  f n ± -a (f m)  vp K v(Vr K v) (an N)")
apply (erule exE)
apply (drule_tac x = M in spec)
apply (erule exE, erule conjE)
apply (rotate_tac -3,
       frule_tac x = m in spec)
    apply (thin_tac "n m. M < n  M < m 
               f n ± -a (f m)  (vp K v)(Vr K v) (an L)")
   apply (subgoal_tac "M < m  (ma. M < ma  
                             n_val K v (f m) = n_val K v (f ma))")
   apply blast
  apply simp
 
 apply (rule allI, rule impI)
 apply (rotate_tac -2)
 apply (drule_tac x = ma in spec)
 apply simp
 (** we have f ma ± -a f m ∈ vpr K G a i v ♢Vr K G a i v L as **) 
 apply (frule Vr_ring[of "v"], 
        frule_tac n = "an L" in vp_apow_ideal[of "v"], simp)
apply (frule_tac I = "vp K v(Vr K v) (an L)" and x = "f m ± -a (f ma)"
        in Ring.ideal_inv1_closed[of "Vr K v"], assumption+) apply (
        frule_tac I = "vp K v(Vr K v) (an L)" and 
        h = "f m ± -a (f ma)" in Ring.ideal_subset[of "Vr K v"], 
        assumption+, simp add:Vr_mOp_f_mOp)
   apply (frule_tac x = m in spec,
          drule_tac x = ma in spec)  apply (
         
          cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
          frule_tac x = "f ma" in aGroup.ag_mOp_closed[of "K"], assumption+,
          frule_tac x = "f m" and y = "-a (f ma)" in aGroup.ag_p_inv[of "K"],
          assumption+, simp only:aGroup.ag_inv_inv,
          frule_tac x = "f m" in aGroup.ag_mOp_closed[of "K"], assumption+,
          simp add:aGroup.ag_pOp_commute,
          thin_tac "-a ( f m ± -a (f ma)) =  f ma ± -a (f m)",
          thin_tac "f m ± -a (f ma)  vp K v(Vr K v) (an L)")
  (** finally, by f ma = f m ± (f ma ± -a (f m)) and value_less_eq 
      we have the conclusion **)
   apply (frule_tac x = "f ma ± -a (f m)" and n = "an L" in n_value_x_1[of 
         "v" ], simp) apply assumption apply (
         frule n_val_valuation[of "v"], 
         frule_tac x = "f m" and y = "f ma ± -a (f m)" in value_less_eq[of 
         "n_val K v"], assumption+) apply (simp add:aGroup.ag_pOp_closed) 
  apply (
         rule_tac x = "n_val K v (f m)" and y = "an L" and
         z = "n_val K v ( f ma ± -a (f m))" in  
         aless_le_trans, assumption+) 
  apply (frule_tac x = "f ma ± -a (f m)" in Vr_mem_f_mem[of "v"])
  apply (simp add:Ring.ideal_subset)
  apply (frule_tac x = "f m" and y = "f ma ± -a (f m)" in 
         aGroup.ag_pOp_commute[of "K"], assumption+) 
  apply (simp add:aGroup.ag_pOp_assoc,
         simp add:aGroup.ag_l_inv1, simp add:aGroup.ag_r_zero)
done 

lemma (in Corps) no_limit_zero_Cauchy1:"valuation K v; j. f j  carrier K; 
  CauchyK v f; ¬ (limK v f 𝟬)  N M. (m. N < m   v (f M) = v (f m))"
apply (frule no_limit_zero_Cauchy[of "v" "f"], assumption+)
 apply (erule exE)+
 apply (subgoal_tac "m. N < m  v (f M) = v (f m)") apply blast
 apply (rule allI, rule impI)
 apply (frule_tac x = M in spec,
        drule_tac x = m in spec,
        drule_tac x = m in spec, simp)
 apply (simp add:n_val[THEN sym, of "v"])
done
 
definition
  subfield :: "[_, ('b, 'm1) Ring_scheme]  bool" where
  "subfield K K'  Corps K'  carrier K  carrier K'  
                   idmap (carrier K)  rHom K K'"

definition
  v_completion :: "['b  ant, 'b  ant, _, ('b, 'm) Ring_scheme]  bool" 
               ("(4Completion⇘_ _ _ _)" [90,90,90,91]90) where
  "Completionv v' K K'  subfield K K' 
      Completev' K'  (x  carrier K. v x = v' x) 
      (x  carrier K'. (f. CauchyK v f  limK' v' f x))"

lemma (in Corps) subfield_zero:"Corps K'; subfield K K'  𝟬K = 𝟬K'"
apply (simp add:subfield_def, (erule conjE)+)
apply (simp add:rHom_def, (erule conjE)+)
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule Corps.field_is_ring[of "K'"], frule Ring.ring_is_ag[of "K'"])
apply (frule aHom_0_0[of "K" "K'" "IK"], assumption+)
apply (frule aGroup.ag_inc_zero[of "K"], simp add:idmap_def)
done

lemma (in Corps) subfield_pOp:"Corps K'; subfield K K'; x  carrier K;
      y  carrier K  x ± y = x ±K' y"
apply (cut_tac field_is_ring, frule Corps.field_is_ring[of "K'"],
       frule Ring.ring_is_ag[of "K"], frule Ring.ring_is_ag[of "K'"])
apply (simp add:subfield_def, erule conjE, simp add:rHom_def,
       frule conjunct1)
apply (thin_tac "IK  aHom K K' 
     (xcarrier K. ycarrier K. IK (x r y) = IK x rK' IK y) 
     IK 1r = 1rK'")
apply (frule aHom_add[of "K" "K'" "IK" "x" "y"], assumption+,
       frule aGroup.ag_pOp_closed[of "K" "x" "y"], assumption+, 
       simp add:idmap_def)
done

lemma (in Corps) subfield_mOp:"Corps K'; subfield K K'; x  carrier K  
                     -a x = -aK' x"
apply (cut_tac field_is_ring, frule Corps.field_is_ring[of "K'"],
       frule Ring.ring_is_ag[of "K"], frule Ring.ring_is_ag[of "K'"])
apply (simp add:subfield_def, erule conjE, simp add:rHom_def,
       frule conjunct1)
apply (thin_tac "IK  aHom K K' 
     (xcarrier K. ycarrier K. IK (x r y) = IK x rK' IK y) 
     IK 1r = 1rK'")
apply (frule aHom_inv_inv[of "K" "K'" "IK" "x"], assumption+,
       frule aGroup.ag_mOp_closed[of "K" "x"], assumption+)
apply (simp add:idmap_def)
done

lemma (in Corps) completion_val_eq:"Corps K'; valuation K v; valuation K' v'; 
 x  carrier K;  Completionv v' K K'  v x = v' x"
apply (unfold v_completion_def, (erule conjE)+)
apply simp
done

lemma (in Corps) completion_subset:"Corps K'; valuation K v; valuation K' v'; 
 Completionv v' K K'   carrier K  carrier K'"
apply (unfold v_completion_def, (erule conjE)+)
apply (simp add:subfield_def)
done

lemma (in Corps) completion_subfield:"Corps K'; valuation K v; 
       valuation K' v'; Completionv v' K K'   subfield K K'"
apply (simp add:v_completion_def)
done

lemma (in Corps) subfield_sub:"subfield K K'  carrier K  carrier K'"
apply (simp add:subfield_def)
done

lemma (in Corps) completion_Vring_sub:"Corps K'; valuation K v; 
  valuation K' v'; Completionv v' K K'  
                     carrier (Vr K v)  carrier (Vr K' v')"
apply (rule subsetI,
      frule completion_subset[of  "K'" "v" "v'"], assumption+,
      frule_tac x = x in Vr_mem_f_mem[of "v"], assumption+,
      frule_tac x = x in completion_val_eq[of "K'" "v" "v'"],
        assumption+)
apply (frule_tac x1 = x in val_pos_mem_Vr[THEN sym, of  "v"],
       assumption+, simp,
       frule_tac c = x in subsetD[of "carrier K" "carrier K'"], assumption+,
      simp add:Corps.val_pos_mem_Vr[of "K'" "v'"])
done

lemma (in Corps) completion_idmap_rHom:"Corps K'; valuation K v; 
  valuation K' v';  Completionv v' K K'  
             I(Vr K v)  rHom (Vr K v) (Vr K' v')"
apply (frule completion_Vring_sub[of  "K'" "v" "v'"],
         assumption+,
       frule completion_subfield[of "K'" "v" "v'"], 
         assumption+,
       frule Vr_ring[of "v"],
        frule Ring.ring_is_ag[of "Vr K v"],
       frule Corps.Vr_ring[of "K'" "v'"], assumption+,
       frule Ring.ring_is_ag[of "Vr K' v'"])
apply (simp add:rHom_def)
apply (rule conjI) 
 apply (simp add:aHom_def,
        rule conjI,
        simp add:idmap_def, simp add:subsetD)
apply (rule conjI)
 apply (simp add:idmap_def extensional_def)
 apply ((rule ballI)+) apply (
        frule_tac x = a and y = b in aGroup.ag_pOp_closed, assumption+,
        simp add:idmap_def, 
   frule_tac c = a in subsetD[of "carrier (Vr K v)" 
                         "carrier (Vr K' v')"], assumption+,
   frule_tac c = b in subsetD[of "carrier (Vr K v)" 
                         "carrier (Vr K' v')"], assumption+,
   simp add:Vr_pOp_f_pOp,
   frule_tac x = a in Vr_mem_f_mem[of v], assumption,
   frule_tac x = b in Vr_mem_f_mem[of v], assumption,
   simp add:Corps.Vr_pOp_f_pOp,
   simp add:subfield_pOp)
apply (rule conjI)
 apply ((rule ballI)+, 
        frule_tac x = x and y = y in Ring.ring_tOp_closed, assumption+,
        simp add:idmap_def, simp add:subfield_def, erule conjE)
 apply (frule_tac c = x in subsetD[of "carrier (Vr K v)" 
            "carrier (Vr K' v')"], assumption+,
        frule_tac c = y in subsetD[of "carrier (Vr K v)" 
            "carrier (Vr K' v')"], assumption+)
 apply (simp add:Vr_tOp_f_tOp Corps.Vr_tOp_f_tOp)
apply (frule_tac x = x in Vr_mem_f_mem[of "v"], assumption+,
       frule_tac x = y in Vr_mem_f_mem[of "v"], assumption+,
     frule_tac x = x in Corps.Vr_mem_f_mem[of "K'" "v'"], assumption+,
     frule_tac x = y in Corps.Vr_mem_f_mem[of "K'" "v'"], assumption+,
       cut_tac field_is_ring, frule Corps.field_is_ring[of "K'"],
       frule_tac x = x and y = y in Ring.ring_tOp_closed[of "K"], assumption+)
apply (frule_tac x = x and y = y in rHom_tOp[of "K" "K'" _ _ "IK"], 
                 assumption+, simp add:idmap_def)
apply (frule Ring.ring_one[of "Vr K v"], simp add:idmap_def)
apply (simp add:Vr_1_f_1 Corps.Vr_1_f_1)
apply (simp add:subfield_def, (erule conjE)+)
apply (cut_tac field_is_ring, frule Corps.field_is_ring[of "K'"],
       frule Ring.ring_one[of "K"],
       frule rHom_one[of "K" "K'" "IK"], assumption+, simp add:idmap_def)
done

lemma (in Corps) completion_vpr_sub:"Corps K'; valuation K v; valuation K' v';
      Completionv v' K K'  vp K v  vp K' v'"
apply (rule subsetI,
      frule completion_subset[of "K'" "v" "v'"], assumption+,
      frule Vr_ring[of "v"], frule vp_ideal[of "v"],
        frule_tac h = x in Ring.ideal_subset[of "Vr K v" "vp K v"],
        assumption+,
      frule_tac x = x in Vr_mem_f_mem[of  "v"], assumption+,
      frule_tac x = x in completion_val_eq[of "K'" "v" "v'"],
        assumption+)
apply (frule completion_subset[of "K'" "v" "v'"],
        assumption+,
       frule_tac c = x in subsetD[of "carrier K" "carrier K'"], assumption+,
       simp add:Corps.vp_mem_val_poss vp_mem_val_poss)
done

lemma (in Corps) val_v_completion:"Corps K'; valuation K v; valuation K' v'; 
      x  carrier K'; x  𝟬K'; Completionv v' K K' 
   f. (CauchyK v f)  (N. (m. N < m  v (f m) = v' x))"
apply (simp add:v_completion_def, erule conjE, (erule conjE)+)
 apply (rotate_tac -1, drule_tac x = x in bspec, assumption+,
        erule exE, erule conjE,
        subgoal_tac "N. m. N < m  v (f m) = v' x", blast) 
    thm Corps.limit_val
 apply (frule_tac f = f and v = v' in  Corps.limit_val[of "K'" "x"],
        assumption+,
        unfold Cauchy_seq_def, frule conjunct1, fold Cauchy_seq_def) 
apply (rule allI, drule_tac x = j in spec,
       simp add:subfield_def, erule conjE, simp add:subsetD, assumption+)
 apply (simp add:Cauchy_seq_def)
done

lemma (in Corps) v_completion_v_limit:"Corps K'; valuation K v; 
      x  carrier K; subfield K K'; Completev' K'; j. f j  carrier K;  
      valuation K' v'; xcarrier K. v x = v' x; limK' v' f x  limK v f x"
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule Corps.field_is_ring[of K'], frule Ring.ring_is_ag[of "K'"],
       subgoal_tac "j. f j  carrier K'",
       unfold subfield_def, frule conjunct2, fold subfield_def, erule conjE)
apply (frule subsetD[of "carrier K" "carrier K'" "x"], assumption+,
       simp add:limit_diff_val[of "x" "f"],
       subgoal_tac "n. f n ±K' -aK' x = f n ± -a x")
 apply (rule allI)
 apply (simp add:limit_def)
 apply (rotate_tac 6, drule_tac x = N in spec,
        erule exE)
 apply (subgoal_tac "n>M. an N  v'(f n ± -a x)",
        subgoal_tac "n. (v' (f n ± -a x) = v (f n ± -a x))", simp, blast)
 apply (rule allI)
 apply (frule_tac x = "f n ± -a x" in bspec,
        rule aGroup.ag_pOp_closed, assumption+, simp,
        rule aGroup.ag_mOp_closed, assumption+) apply simp
 apply (rule allI, rule impI)
 apply (frule_tac v = v' and n = "an N" and x = "f n ± -a x" in 
         Corps.n_value_x_1[of K'], assumption+, simp, simp)
 apply (frule_tac v = v' and x = "f n ± -a x" in Corps.n_val_le_val[of K'],
         assumption+) 
 apply (cut_tac x = "f n" and y = "-a x" in aGroup.ag_pOp_closed, assumption,
        simp, rule aGroup.ag_mOp_closed, assumption+, simp add:subsetD)
 apply (subst Corps.val_pos_n_val_pos[of K' v'], assumption+)
   apply (cut_tac x = "f n" and y = "-a x" in aGroup.ag_pOp_closed, assumption,
        simp, rule aGroup.ag_mOp_closed, assumption+, simp add:subsetD)
apply (rule_tac i = 0 and j = "an N" and k = "n_val K' v' (f n ± -a x)" in 
       ale_trans, simp+, rule allI)
 apply (subst subfield_pOp[of K'], assumption+, simp+,
        rule aGroup.ag_mOp_closed, assumption+)
 apply (simp add:subfield_mOp[of K'])
 apply (cut_tac subfield_sub[of K'], simp add:subsetD, assumption+)
done
    
lemma (in Corps) Vr_idmap_aHom:"Corps K'; valuation K v; valuation K' v'; 
      subfield K K'; xcarrier K. v x = v' x  
                              I(Vr K v)  aHom (Vr K v) (Vr K' v')"
apply (simp add:aHom_def)
apply (subgoal_tac "I(Vr K v)  carrier (Vr K v)  carrier (Vr K' v')")
apply simp
apply (rule conjI)
 apply (simp add:idmap_def)
apply (rule ballI)+
 apply (frule Vr_ring[of "v"],
        frule Ring.ring_is_ag[of "Vr K v"],
        frule Corps.Vr_ring[of "K'" "v'"], assumption+,
        frule Ring.ring_is_ag[of "Vr K' v'"]) 
 apply (frule_tac x = a and y = b in aGroup.ag_pOp_closed[of "Vr K v"],
               assumption+,
        frule_tac x = a in funcset_mem[of "I(Vr K v)" 
        "carrier (Vr K v)" "carrier (Vr K' v')"], assumption+,
        frule_tac x = b in funcset_mem[of "I(Vr K v)" 
        "carrier (Vr K v)" "carrier (Vr K' v')"], assumption+,
        frule_tac x = "(I(Vr K v)) a" and y = "(I(Vr K v)) b" in 
        aGroup.ag_pOp_closed[of "Vr K' v'"], assumption+, 
        simp add:Vr_pOp_f_pOp)
 apply (simp add:idmap_def, simp add:subfield_def, erule conjE,
        simp add:rHom_def, frule conjunct1,
        thin_tac "IK  aHom K K' 
           (xcarrier K. ycarrier K. IK (x r y) = IK x rK' IK y) 
           IK 1r = 1rK'")
  apply (simp add:Corps.Vr_pOp_f_pOp[of K' v'])
  apply (frule_tac x = a in Vr_mem_f_mem[of v], assumption+,
         frule_tac x = b in Vr_mem_f_mem[of v], assumption+)
  apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of K],
         frule Corps.field_is_ring[of K'], frule Ring.ring_is_ag[of K']) 
  apply (frule_tac a = a and b = b in aHom_add[of K K' "IK"], assumption+,
         frule_tac x = a and y = b in aGroup.ag_pOp_closed[of K], assumption+,
         simp add:idmap_def)
apply (rule Pi_I,
       drule_tac x = x in bspec, simp add:Vr_mem_f_mem)
apply (simp add:idmap_def)
 apply (frule_tac x1 = x in val_pos_mem_Vr[THEN sym, of v],
         simp add:Vr_mem_f_mem, simp)
 apply (subst Corps.val_pos_mem_Vr[THEN sym, of K' v'], assumption+,
        frule_tac x = x in Vr_mem_f_mem[of v], assumption+,
        frule subfield_sub[of K'], simp add:subsetD)
 apply assumption
done

lemma amult_pos_pos:"0  a  0  a * an N"
apply (case_tac "N = 0", simp add:an_0)
 apply (case_tac "a = ", simp) 
 apply (frule apos_neq_minf[of a])
 apply (subst ant_tna[THEN sym, of a], simp)
 apply (subst amult_0_r, simp)
apply (case_tac "a = ", simp add:an_def) 
 apply (frule apos_neq_minf[of a])
 apply (subst ant_tna[THEN sym, of a], simp)
 apply (case_tac "a = 0", simp)
 apply (simp add:ant_0 an_def amult_0_l)
apply (cut_tac amult_pos1[of "tna a" "an N"]) 
 apply (simp add:ant_tna)
 apply (rule_tac ale_trans[of 0 "an N" "a * an N"], simp+)
 apply (frule ale_neq_less[of 0 a], rule not_sym, assumption)
 apply (subst aless_zless[THEN sym, of 0 "tna a"], simp add:ant_tna ant_0)
 apply simp
done

lemma (in Corps) Cauchy_down:"Corps K'; valuation K v; valuation K' v'; 
  subfield K K'; xcarrier K. v x = v' x; j. f j  carrier K; CauchyK' v' f 
    CauchyK v f" 
apply (simp add:Cauchy_seq_def, rule allI, erule conjE) 
apply (rotate_tac -1, drule_tac 
  x = "na (Lv K v) * N" in spec,
  erule exE,
  subgoal_tac "n m. M < n  M < m 
      f n ± (-a (f m))  vp K v(Vr K v) (an N)", blast)
 apply (simp add:amult_an_an) apply (simp add:an_na_Lv)
 apply ((rule allI)+, rule impI, erule conjE) apply (
      rotate_tac -3, drule_tac x = n in spec,
      rotate_tac -1, drule_tac x = m in spec,
      simp)
 apply (rotate_tac 7,
        frule_tac x = n in spec,
        drule_tac x = m in spec)
 apply (simp add:subfield_mOp[THEN sym],
        cut_tac field_is_ring, frule Ring.ring_is_ag[of K],
        frule_tac x = "f m" in aGroup.ag_mOp_closed[of K], assumption+)
 apply (simp add:subfield_pOp[THEN sym])
 apply (frule_tac x = "f n" and y = "-a f m" in aGroup.ag_pOp_closed, 
        assumption+,
        frule subfield_sub[of K'],
        frule_tac c = "f n ± -a f m" in subsetD[of "carrier K" "carrier K'"], 
        assumption+)
 apply (frule Lv_pos[of v],
        frule aless_imp_le[of 0 "Lv K v"])
 apply (frule_tac N = N in amult_pos_pos[of "Lv K v"])
 apply (frule_tac n = "(Lv K v) * an N" and x = "f n ± -a f m" in 
        Corps.n_value_x_1[of K' v'], assumption+)
 apply (frule_tac x = "f n ± -a f m" in Corps.n_val_le_val[of K' v'],
        assumption+,
        frule_tac j = "Lv K v * an N" and k = "n_val K' v' (f n ± -a f m)" in
         ale_trans[of 0], assumption+, simp add:Corps.val_pos_n_val_pos)
 apply (frule_tac i = "Lv K v * an N" and j = "n_val K' v' (f n ± -a f m)" 
        and k = "v' (f n ± -a f m)" in ale_trans, assumption+,
        thin_tac "n_val K' v' (f n ± -a f m)  v' (f n ± -a f m)",
        thin_tac "Lv K v * an N  n_val K' v' (f n ± -a f m)")
 apply (rotate_tac 1,
        drule_tac x = "f n ± -a f m" in bspec, assumption,
        rotate_tac -1, drule sym, simp)
 apply (frule_tac v1 = v and x1 = "f n ± -a f m" in n_val[THEN sym],
        assumption)
 apply simp
 apply (simp only:amult_commute[of _ "Lv K v"])
apply (frule Lv_z[of v], erule exE)
 
apply (cut_tac w = z and x = "an N" and y = "n_val K v (f n ± -a f m)" in
       amult_pos_mono_l,
       cut_tac m = 0 and n = z in aless_zless, simp add:ant_0)
 apply simp
 apply (rule_tac x="f n ± -a (f m)" and n = "an N" in n_value_x_2[of v], 
        assumption+) 
 apply (subst val_pos_mem_Vr[THEN sym, of v], assumption+)
 apply (subst val_pos_n_val_pos[of v], assumption+)
 apply (rule_tac j = "an N" and k = "n_val K v (f n ± -a f m)" in 
        ale_trans[of 0], simp, assumption+)
 apply simp
done

lemma (in Corps) Cauchy_up:"Corps K'; valuation K v; valuation K' v'; 
      Completionv v' K K'; Cauchy K v f  Cauchy K' v' f" 
apply (simp add:Cauchy_seq_def,
       erule conjE,
       rule conjI, unfold v_completion_def, frule conjunct1,
       fold v_completion_def, rule allI, frule subfield_sub[of K'])
apply (simp add:subsetD) 

apply (rule allI)
apply (rotate_tac -1, drule_tac x = "na (Lv K' v') * N" 
      in spec, erule exE) 
apply (subgoal_tac "n m. M < n  M < m 
         f n ±K' (-aK' (f m))  vp K' v'(Vr K' v') (an N)", blast,
       (rule allI)+, rule impI, erule conjE)
apply (rotate_tac -3, drule_tac x = n in spec,
       rotate_tac -1, 
       drule_tac x = m in spec, simp,
       frule_tac x = n in spec,
       drule_tac x = m in spec)
 apply(unfold v_completion_def, frule conjunct1, fold v_completion_def,
       cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule_tac x = "f m" in aGroup.ag_mOp_closed[of "K"], assumption+,
       frule_tac x = "f n" and y = "-a (f m)" in aGroup.ag_pOp_closed[of "K"],
       assumption+)
 apply (simp add:amult_an_an) apply (simp add:Corps.an_na_Lv)
apply (simp add:subfield_mOp, simp add:subfield_pOp) apply (
       frule_tac x = "f n  ±K' -aK' f m" and n = "(Lv K' v') * (an N)"
       in n_value_x_1[of v]) (*apply (
  thin_tac "f n ±' (-a' (f m)) ∈ vp K v(Vr K v) ( (Lv K' v') * (an N))",
   simp add:v_completion_def, (erule conjE)+) *) 
apply (frule Corps.Lv_pos[of "K'" "v'"], assumption+, 
       frule Corps.Lv_z[of "K'" "v'"],
       assumption, erule exE, simp, 
       cut_tac n = N in an_nat_pos,
       frule_tac w1 = z and x1 = 0 and y1 = "an N" in 
             amult_pos_mono_l[THEN sym], simp, simp add:amult_0_r)
apply assumption
apply (frule_tac x = "f n ±K' -aK' f m " in n_val_le_val[of v],
        assumption+)
apply (subst n_val[THEN sym, of "v"], assumption+)
apply (frule Lv_pos[of "v"], frule Lv_z[of v], erule exE, simp)
apply (frule Corps.Lv_pos[of "K'" "v'"], assumption+, 
       frule Corps.Lv_z[of "K'" "v'"],   assumption, erule exE, simp, 
       cut_tac n = N in an_nat_pos,
       frule_tac w1 = za and x1 = 0 and y1 = "an N" in 
             amult_pos_mono_l[THEN sym], simp, simp add:amult_0_r)
apply (frule_tac j = "ant za * an N" and k = "n_val K v (f n ±K' -aK' (f m))"
       in ale_trans[of "0"], assumption+)
apply (frule_tac w1 = z and x1 = 0 and y1 = "n_val K v ( f n ±K' -aK' (f m))"
       in amult_pos_mono_r[THEN sym], simp, simp add:amult_0_l)
apply (frule_tac i = "Lv K' v' * an N" and j ="n_val K v ( f n ±K' -aK' (f m))"
       and k = "v ( f n ±K' -aK' (f m))" in ale_trans, assumption+)
apply (thin_tac "f n ±K' -aK' (f m)  vp K v (Vr K v) (Lv K' v') * (an N)",
       thin_tac "Lv K' v' * an N  n_val K v ( f n ±K' -aK' (f m))",
       thin_tac "n_val K v ( f n ±K' -aK' (f m))  v ( f n ±K' -aK' (f m))")

apply (simp add:v_completion_def, (erule conjE)+)
 apply (thin_tac "xcarrier K. v x = v' x",
        thin_tac "xcarrier K'. f. Cauchy K v f  lim K' v' f x")
 apply (frule subfield_sub[of K'],
        frule_tac c = "f n ±K' -aK' (f m)" in 
                  subsetD[of "carrier K" "carrier K'"], assumption+)
apply (simp add:Corps.n_val[THEN sym, of "K'" "v'"])
apply (simp add:amult_commute[of _ "Lv K' v'"])
apply (frule Corps.Lv_pos[of "K'" "v'"], assumption, 
       frule Corps.Lv_z[of "K'" "v'"], assumption+, erule exE, simp)
apply (simp add:amult_pos_mono_l)

apply (rule_tac x = "f n ±K' -aK' (f m)" and n = "an N" in 
       Corps.n_value_x_2[of "K'" "v'"], assumption+)
apply (cut_tac n = N in an_nat_pos)
 apply (frule_tac j = "an N" and k = "n_val K' v' (f n ±K' -aK' (f m))" in 
        ale_trans[of "0"], assumption+)
 apply (simp add:Corps.val_pos_n_val_pos[THEN sym, of "K'" "v'"])
 apply (simp add:Corps.val_pos_mem_Vr) apply assumption apply simp
done

lemma max_gtTr:"(n::nat) < max (Suc n) (Suc m)  m < max (Suc n) (Suc m)"
by (simp add:max_def)

lemma (in Corps) completion_approx:"Corps K'; valuation K v; valuation K' v'; 
      Completionv v' K K'; x  carrier (Vr K' v')  
               ycarrier (Vr K v). (y ±K' -aK' x)  (vp K' v')"
(** show an element y near by x is included in (Vr K v) **) 
apply (frule Corps.Vr_mem_f_mem [of "K'" "v'" "x"], assumption+,
       frule Corps.val_pos_mem_Vr[THEN sym, of "K'" "v'" "x"], assumption+,
       simp add:v_completion_def, (erule conjE)+,
       rotate_tac -1, drule_tac x = x in bspec, assumption+, 
       erule exE, erule conjE)
apply (unfold Cauchy_seq_def, frule conjunct1, fold Cauchy_seq_def)
apply (case_tac "x = 𝟬K'", 
       simp, frule Corps.field_is_ring[of "K'"], 
       frule Ring.ring_is_ag[of "K'"],
       subgoal_tac " 𝟬K'  carrier (Vr K v)",
       subgoal_tac " (𝟬K' ±K' -aK' 𝟬K') vp K' v'", blast,
       frule aGroup.ag_inc_zero[of "K'"], simp add:aGroup.ag_r_inv1,
       simp add:Corps.Vr_0_f_0[THEN sym, of "K'" "v'"],
       frule Corps.Vr_ring[of "K'" "v'"], assumption+,
       frule Corps.vp_ideal[of "K'" "v'"], assumption+,
       simp add:Ring.ideal_zero,
       simp add:subfield_zero[THEN sym, of  "K'"],
       cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule aGroup.ag_inc_zero[of "K"],
       simp add:Vr_0_f_0[THEN sym, of "v"],
       frule Vr_ring[of "v"],simp add:Ring.ring_zero)
      apply (frule_tac f = f in Corps.limit_val[of "K'" "x" _ "v'"], 
                         assumption+)
      apply (rule allI, rotate_tac -2, frule_tac x = j in spec,
             frule subfield_sub[of K'], simp add:subsetD, assumption+)
apply (erule exE)
 apply (simp add:limit_def,
        frule Corps.Vr_ring[of K' v'], assumption+,
        rotate_tac 10,
              drule_tac x = "Suc 0" in spec, erule exE,
       rotate_tac 1,
              frule_tac x = N and y = M in two_inequalities, assumption+,
              thin_tac "n>N. v' (f n) = v' x",
              thin_tac "n>M. f n ±K' -aK' x  vp K' v' (Vr K' v') (an (Suc 0))")
       apply (frule Corps.vp_ideal[of K' v'], assumption+,
              simp add:Ring.r_apow_Suc[of "Vr K' v'" "vp K' v'"])
       apply (drule_tac x = "N + M + 1" in spec, simp,
              drule_tac x = "N + M + 1" in spec, simp,
              erule conjE)
 apply (drule_tac x = "f (Suc (N + M))" in bspec, assumption+)
 apply simp 
 apply (cut_tac x = "f (Suc (N + M))" in val_pos_mem_Vr[of v], assumption+)
 apply simp apply blast
done

lemma (in Corps) res_v_completion_surj:" Corps K'; valuation K v; 
      valuation K' v'; Completionv v' K K'  
      surjec(Vr K v),(qring (Vr K' v') (vp K' v')) 
            (compos (Vr K v) (pj (Vr K' v') (vp K' v')) (I(Vr K v)))"
apply (frule Vr_ring[of "v"], 
       frule Ring.ring_is_ag[of "Vr K v"],
       frule Corps.Vr_ring[of "K'" "v'"], assumption+,
       frule Ring.ring_is_ag[of "Vr K' v'"],
       frule Ring.ring_is_ag[of "Vr K v"])
apply (frule Corps.vp_ideal[of "K'" "v'"], assumption+, 
       frule Ring.qring_ring[of "Vr K' v'" "vp K' v'"], assumption+)
apply (simp add:surjec_def)
apply (frule aHom_compos[of "Vr K v" "Vr K' v'" 
      "qring (Vr K' v') (vp K' v')" "I(Vr K v)" 
      "pj (Vr K' v') (vp K' v')"], assumption+, simp add:Ring.ring_is_ag)
apply (rule Vr_idmap_aHom, assumption+) apply (simp add:completion_subfield,
      simp add:v_completion_def) apply (
      frule pj_Hom[of "Vr K' v'" "vp K' v'"], assumption+) apply ( 
      simp add:rHom_def, simp)
apply (rule surj_to_test)
 apply (simp add:aHom_def)
apply (rule ballI) 
 apply (thin_tac "Ring (Vr K' v' /r vp K' v')",
  thin_tac "compos (Vr K v) (pj (Vr K' v') (vp K' v')) (I(Vr K v))  
               aHom (Vr K v) (Vr K' v' /r vp K' v')")
 apply (simp add:Ring.qring_carrier)
 apply (erule bexE)
 apply (frule_tac x = a in completion_approx[of "K'" "v" "v'"], 
       assumption+, erule bexE)
 apply (subgoal_tac "compos (Vr K v) (pj (Vr K' v') 
                     (vp K' v')) ((I(Vr K v))) y = b", blast)
 apply (simp add:compos_def compose_def idmap_def)
 apply (frule completion_Vring_sub[of "K'" "v" "v'"], assumption+)
 apply (frule_tac c = y in subsetD[of "carrier (Vr K v)" "carrier (Vr K' v')"],
         assumption+)
 apply (frule_tac x = y in pj_mem[of "Vr K' v'" "vp K' v'"], assumption+, simp,
        thin_tac "pj (Vr K' v') (vp K' v') y = y(Vr K' v') (vp K' v')")
 apply (rotate_tac -5, frule sym, thin_tac "a(Vr K' v') (vp K' v') = b", 
       simp)
 apply (rule_tac b1 = y and a1 = a in Ring.ar_coset_same1[THEN sym, 
        of "Vr K' v'" "vp K' v'"], assumption+)
 apply (frule Ring.ring_is_ag[of "Vr K' v'"], 
        frule_tac x = a in aGroup.ag_mOp_closed[of "Vr K' v'"],
        assumption+)
 apply (simp add:Corps.Vr_mOp_f_mOp, simp add:Corps.Vr_pOp_f_pOp)
done

lemma (in Corps) res_v_completion_ker:"Corps K'; valuation K v; 
      valuation K' v'; Completionv v' K K'  
  ker(Vr K v), (qring (Vr K' v') (vp K' v')) 
  (compos (Vr K v) (pj (Vr K' v') (vp K' v')) (I(Vr K v))) = vp K v"
apply (rule equalityI)
 apply (rule subsetI)
 apply (simp add:ker_def, (erule conjE)+)
 apply (frule Corps.Vr_ring[of "K'" "v'"], assumption+,
        frule Corps.vp_ideal[of "K'" "v'"], assumption+,
        frule Ring.qring_ring[of "Vr K' v'" "vp K' v'"], assumption+,
        simp add:Ring.qring_zero)
 apply (simp add:compos_def, simp add:compose_def, simp add:idmap_def)
 apply (frule completion_Vring_sub[of "K'" "v" "v'"], assumption+)
 apply (frule_tac c = x in subsetD[of "carrier (Vr K v)" "carrier (Vr K' v')"],
        assumption+)
 apply (simp add:pj_mem)
 apply (frule_tac a = x in Ring.qring_zero_1[of "Vr K' v'" _  "vp K' v'"], 
        assumption+)
 apply (subst vp_mem_val_poss[of v], assumption+) 
 apply (simp add:Vr_mem_f_mem)
 apply (frule_tac x = x in Corps.vp_mem_val_poss[of "K'" "v'"],
        assumption+, simp add:Corps.Vr_mem_f_mem, simp)
apply (frule_tac x = x in Vr_mem_f_mem[of v], assumption+)
 apply (frule_tac x = x in completion_val_eq[of "K'" "v" "v'"],
         assumption+, simp)
apply (rule subsetI)
 apply (simp add:ker_def)
 apply (frule Vr_ring[of  "v"])
 apply (frule vp_ideal[of "v"])
 apply (frule_tac h = x in Ring.ideal_subset[of "Vr K v" "vp K v"],
         assumption+, simp)
 apply (frule Corps.Vr_ring[of "K'" "v'"], assumption+,
        frule Corps.vp_ideal[of "K'" "v'"], assumption+, 
        simp add:Ring.qring_zero)
 apply (simp add:compos_def compose_def idmap_def)
 apply (frule completion_Vring_sub[of "K'" "v" "v'"],
        assumption+, frule_tac c = x in subsetD[of "carrier (Vr K v)"
        "carrier (Vr K' v')"], assumption+)
 apply (simp add:pj_mem)
 apply (frule completion_vpr_sub[of "K'" "v" "v'"], assumption+,
        frule_tac c = x in subsetD[of "vp K v" "vp K' v'"], assumption+)
 apply (simp add:Ring.ar_coset_same4[of "Vr K' v'" "vp K' v'"])
done 

lemma (in Corps) completion_res_qring_isom:"Corps K'; valuation K v; 
  valuation K' v'; Completionv v' K K'   
   r_isom ((Vr K v) /r (vp K v)) ((Vr K' v') /r (vp K' v'))"
apply (subst r_isom_def)
apply (frule res_v_completion_surj[of "K'" "v" "v'"], assumption+)
apply (frule Vr_ring[of "v"],
       frule Corps.Vr_ring[of "K'" "v'"], assumption+,
       frule Corps.vp_ideal[of "K'" "v'"], assumption+,
       frule Ring.qring_ring[of "Vr K' v'" "vp K' v'"], assumption+)
apply (frule rHom_compos[of "Vr K v" "Vr K' v'" "(Vr K' v' /r vp K' v')" 
       "(I(Vr K v))" "pj (Vr K' v') (vp K' v')"], assumption+)
apply (simp add:completion_idmap_rHom)
apply (simp add:pj_Hom) 
apply (frule surjec_ind_bijec [of "Vr K v" "(Vr K' v' /r vp K' v')" 
      "compos (Vr K v) (pj (Vr K' v') (vp K' v')) (I(Vr K v))"], assumption+)
apply (frule ind_hom_rhom[of "Vr K v" "(Vr K' v' /r vp K' v')" 
       "compos (Vr K v) (pj (Vr K' v') (vp K' v')) (I(Vr K v))"], assumption+)
apply (simp add:res_v_completion_ker) apply blast
done

text‹expansion of x in a complete field K, with normal valuation v. Here
we suppose t is an element of K satisfying the equation v t = 1›.›

definition
  Kxa :: "[_, 'b  ant, 'b]  'b set" where
  "Kxa K v x = {y. kcarrier (Vr K v). y = x rK k}"
    (**  x *r carrier (Vr K v) **)

primrec 
  partial_sum :: "[('b, 'm) Ring_scheme, 'b, 'b  ant, 'b] 
                                    nat  'b"
        ("(5psum⇘ _ _ _ _ _)" [96,96,96,96,97]96)
where
  psum_0: "psum K x v t 0 = (csrp_fn (Vr K v) (vp K v) 
     (pj (Vr K v) (vp K v) (x rK tK-(tna (v x))))) rK (tK(tna (v x)))"
| psum_Suc: "psum K x v t (Suc n) = (psum K x v t n) ±K 
  ((csrp_fn (Vr K v) (vp K v) (pj (Vr K v) (vp K v)  
   ((x ±K -aK (psum K x v t n)) rK (tK- (tna (v x) + int (Suc n)))))) rK 
         (tK(tna (v x) + int (Suc n))))" 

definition
  expand_coeff :: "[_ , 'b  ant, 'b, 'b] 
                       nat  'b"
                   ("(5ecf⇘_ _ _ _ _)" [96,96,96,96,97]96) where
  "ecfK v t x n = (if n = 0 then  csrp_fn (Vr K v) (vp K v) 
     (pj (Vr K v) (vp K v) (x rK tK(-(tna (v x)))))
     else csrp_fn (Vr K v) (vp K v) (pj (Vr K v) 
  (vp K v) ((x ±K -aK (psum K x v t (n - 1))) rK (tK(- (tna (v x) + int n))))))" 

definition
  expand_term :: "[_, 'b  ant, 'b, 'b] 
                       nat  'b"
                   ("(5etm⇘ _ _ _ _ _)" [96,96,96,96,97]96) where
        
  "etmK v t x n = (ecfK v t x n)rK (tK(tna (v x) + int n))"



(*** Let O be the valuation ring with respect to the valuation v and let P
be the maximal ideal of O. Let j be the value of x (∈ O), and  a0 be an 
element of the complete set of representatives such that a0 = x t-j mod P.
 We see that (a0 - x t-j)/t is an element of O, and then we choose a1 an 
element of the complete set of representatives which is equal to (a0 - x t-j)/tmodulo P. We see x - (a0tj + a1t(j+1) + … + ast(j+s)) ∈ (t(j+s+1)). 
"psum G a i K v t x s" is the partial sum a0tj + a1t(j+1) + … + ast(j+s) ***)  

lemma (in Corps) Kxa_val_ge:"valuation K v; t  carrier K; v t = 1 
   Kxa K v (tKj) = {x. x  carrier K  (ant j)  (v x)}"
apply (frule val1_neq_0[of v t], assumption+)
apply (cut_tac field_is_ring) 
apply (rule equalityI)
 apply (rule subsetI,
        simp add:Kxa_def, erule bexE,
        frule_tac x = k in Vr_mem_f_mem[of "v"], assumption+,
        frule npowf_mem[of "t" "j"], simp, 
        simp add:Ring.ring_tOp_closed)
 apply (simp add:val_t2p) apply (simp add:val_exp[THEN sym]) 
 apply (simp add:val_pos_mem_Vr[THEN sym, of "v"])
 apply (frule_tac x = 0 and y = "v k" in aadd_le_mono[of _ _ "ant j"])
 apply (simp add:aadd_0_l aadd_commute)
apply (rule subsetI, simp, erule conjE)
 apply (simp add:Kxa_def)
 apply (case_tac "x = 𝟬K")
 apply (frule Vr_ring[of "v"], 
        frule Ring.ring_zero[of "Vr K v"],
        simp add:Vr_0_f_0,
        frule_tac x1 = "tKj" in Ring.ring_times_x_0[THEN sym, of "K"],
        simp add:npowf_mem, blast)
 apply (frule val_exp[of "v" "t" "j"], assumption+, simp) 
 apply (frule field_potent_nonzero1[of "t" "j"], 
        frule npowf_mem[of "t" "j"], assumption+)
 apply (frule_tac y = "v x" in ale_diff_pos[of "v (tKj)"], 
        simp add:diff_ant_def)
apply (cut_tac npowf_mem[of t j]) 
 defer 
 apply assumption apply simp
apply (frule value_of_inv[THEN sym, of "v" "tKj"], assumption+) 
 
 apply (cut_tac invf_closed1[of "tKj"], simp, erule conjE)
 apply (frule_tac x1 = x in val_t2p[THEN sym, of "v" _ "(tKj)K"], 
        assumption+, simp)
 apply (frule_tac x = "(tKj)K" and y = x in Ring.ring_tOp_closed[of "K"], 
          assumption+)
 apply (simp add:Ring.ring_tOp_commute[of "K" _ "(tKj)K"])
 apply (frule_tac x = "((tKj)K) r x" in val_pos_mem_Vr[of v], assumption+, 
        simp)
 apply (frule_tac z = x in Ring.ring_tOp_assoc[of "K" "tKj" "(tKj)K"], 
         assumption+) 
 apply (simp add:Ring.ring_tOp_commute[of K "tKj" "(tKj)K"] linvf,
        simp add:Ring.ring_l_one, blast) 
 apply simp
done

lemma (in Corps) Kxa_pow_vpr:" valuation K v; t  carrier K; v t = 1;
    (0::int)  j  Kxa K v (tKj) = (vp K v)(Vr K v) (ant j)"
apply (frule val_surj_n_val[of v], blast) 
apply (simp add:Kxa_val_ge) 
apply (rule equalityI)
 apply (rule subsetI, simp, erule conjE)
 apply (rule_tac x = x in n_value_x_2[of "v" _ "(ant j)"],
            assumption+)
 apply (cut_tac ale_zle[THEN sym, of "0" "j"]) 
 apply (frule_tac a = "0  j" and b = "ant 0  ant j" in a_b_exchange,
         assumption+) 
 apply (thin_tac "(0  j) = (ant 0  ant j)", simp add:ant_0)
 apply (frule_tac k = "v x" in ale_trans[of "0" "ant j"], assumption+)
 apply (simp add:val_pos_mem_Vr) apply simp
 apply (simp only:ale_zle[THEN sym, of "0" "j"], simp add:ant_0)
apply (rule subsetI)
 apply simp 
 apply (frule_tac x = x in mem_vp_apow_mem_Vr[of "v" "ant j"]) 
 apply (simp only:ale_zle[THEN sym, of "0" "j"], simp add:ant_0) 
 apply assumption
apply (simp add:Vr_mem_f_mem[of "v"])
apply (frule_tac x = x in n_value_x_1[of "v" "ant j" _ ])
 apply (simp only:ale_zle[THEN sym, of "0" "j"], simp add:ant_0) 
 apply assumption apply simp
done  

lemma (in Corps) field_distribTr:"a  carrier K; b  carrier K; 
      x  carrier K; x  𝟬  a ± (-a (b r x)) = (a r (xK) ± (-a b)) r x"
apply (cut_tac field_is_ring,
       cut_tac invf_closed1[of x], simp, erule conjE) apply (
       simp add:Ring.ring_inv1_1[of "K" "b" "x"],
       frule Ring.ring_is_ag[of "K"],
       frule aGroup.ag_mOp_closed[of "K" "b"], assumption+)
apply (frule Ring.ring_tOp_closed[of "K" "a" "xK"], assumption+,
       simp add:Ring.ring_distrib2, simp add:Ring.ring_tOp_assoc, 
       simp add:linvf,
       simp add:Ring.ring_r_one)
apply simp
done

lemma a0_le_1[simp]:"(0::ant)  1"
by (cut_tac a0_less_1, simp add:aless_imp_le)

lemma (in Corps) vp_mem_times_t:"valuation K v; t  carrier K; t  𝟬; 
       v t = 1; x  vp K v  acarrier (Vr K v). x = a r t" 
apply (frule Vr_ring[of v],
       frule vp_ideal[of v]) 
 apply (frule val_surj_n_val[of v], blast)
 apply (frule vp_mem_val_poss[of v x],
        frule_tac h = x in Ring.ideal_subset[of "Vr K v" "vp K v"], 
        assumption+, simp add:Vr_mem_f_mem, simp) 
 apply (frule gt_a0_ge_1[of "v x"])
 apply (subgoal_tac "v t  v x") 
 apply (thin_tac "1  v x")
 apply (frule val_Rxa_gt_a_1[of "v" "t" "x"])
 apply (subst val_pos_mem_Vr[THEN sym, of "v" "t"], assumption+)
 apply simp 
 apply (simp add:vp_mem_Vr_mem) apply assumption+
 apply (simp add:Rxa_def, erule bexE) 
 apply (cut_tac a0_less_1) 
 apply (subgoal_tac "0  v t")
 apply (frule val_pos_mem_Vr[of "v" "t"], assumption+)
 apply (simp, simp add:Vr_tOp_f_tOp, blast, simp+)
done

lemma (in Corps) psum_diff_mem_Kxa:"valuation K v; t  carrier K; 
      v t = 1; x  carrier K; x  𝟬  
     (psum K x v t n)  carrier K  
     ( x ± (-a (psum K x v t n)))  Kxa K v (tK((tna (v x)) + (1 + int n)))"
apply (frule val1_neq_0[of v t], assumption+)
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"],
       frule Vr_ring[of v], frule vp_ideal[of v])
apply (induct_tac n)
apply (subgoal_tac "x r (tK- tna (v x))  carrier (Vr K v)",
       rule conjI, simp, rule Ring.ring_tOp_closed[of "K"], assumption+,
       frule Ring.csrp_fn_mem[of "Vr K v" "vp K v" 
       "pj (Vr K v) (vp K v) (x r (tK- tna (v x)))"], 
       assumption+,
       simp add:pj_mem Ring.qring_carrier, blast,
       simp add:Vr_mem_f_mem, simp add:npowf_mem)
apply (simp, 
     frule npowf_mem[of "t" "tna (v x)"], assumption+,
     frule field_potent_nonzero1[of "t" "tna (v x)"], assumption+,
     subst field_distribTr[of "x" _ "tK(tna (v x))"], assumption+,
     frule Ring.csrp_fn_mem[of "Vr K v" "vp K v" 
     "pj (Vr K v) (vp K v) (x r (tK- tna (v x)))"], 
     assumption+,
     simp add:pj_mem Ring.qring_carrier, blast, simp add:Vr_mem_f_mem,
     simp add:npowf_mem, assumption) 
apply (frule Ring.csrp_diff_in_vpr[of "Vr K v" "vp K v" 
       "x r ((tK(tna (v x)))K)"], assumption+) 
      apply (simp add:npowf_minus)
 
 apply (simp add:npowf_minus)
 apply (frule pj_Hom[of "Vr K v" "vp K v"], assumption+)
 apply (frule rHom_mem[of "pj (Vr K v) (vp K v)" "Vr K v" "Vr K v /r vp K v" 
        "x r (tK- tna (v x))"], assumption+)
 apply (frule Ring.csrp_fn_mem[of "Vr K v" "vp K v" 
         "pj (Vr K v) (vp K v) (x r (tK- tna (v x)))"], assumption+)
 apply (frule Ring.ring_is_ag[of "Vr K v"], 
        frule_tac x = "csrp_fn (Vr K v) (vp K v) (pj (Vr K v) (vp K v) 
       (x r (tK- tna (v x))))" in aGroup.ag_mOp_closed[of "Vr K v"], assumption+)
 apply (simp add:Vr_pOp_f_pOp) apply (simp add:Vr_mOp_f_mOp)
apply (frule_tac x = "x r (tK- tna (v x)) ± -a (csrp_fn (Vr K v) (vp K v)
      (pj (Vr K v) (vp K v) (x r (tK- tna (v x)))))" in 
      vp_mem_times_t[of "v" "t"], assumption+, erule bexE, simp)
apply (frule_tac x = a in Vr_mem_f_mem[of  "v"], assumption+)
apply (simp add:Ring.ring_tOp_assoc[of "K"])
 apply (simp add:npowf_exp_1_add[THEN sym, of "t" "tna (v x)"]) 
 apply (simp add:add.commute)
apply (simp add:Kxa_def) 
apply (frule npowf_mem[of "t" "1 + tna (v x)"], assumption+)
apply (simp add:Ring.ring_tOp_commute[of "K" _ "tK(1 + tna (v x))"])
 apply blast
 apply (frule npowf_mem[of  "t" "- tna (v x)"], assumption+)
 apply (frule Ring.ring_tOp_closed[of "K" "x" "tK- tna (v x)"], assumption+)
apply (subst val_pos_mem_Vr[THEN sym, of v], assumption+)
 apply (simp add:val_t2p) apply (simp add:val_exp[THEN sym, of "v" "t"])
 apply (simp add:aminus[THEN sym])
 apply (frule value_in_aug_inf[of "v" "x"], assumption+, 
        simp add:aug_inf_def)
 apply (frule val_nonzero_noninf[of "v" "x"], assumption+,
         simp add:ant_tna)
 apply (simp add:aadd_minus_r)

apply (erule conjE)
 apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"])
 apply (rule conjI)
 apply simp
 apply (rule aGroup.ag_pOp_closed, assumption+)
 apply (rule Ring.ring_tOp_closed[of "K"], assumption+)
 apply (simp add:Kxa_def, erule bexE, simp)
 apply (subst Ring.ring_tOp_commute, assumption+)
 apply (rule npowf_mem, assumption+) apply (simp add:Vr_mem_f_mem)
 apply (frule_tac n = "tna (v x) + (1 + int n)" in npowf_mem[of t ], 
        assumption,
        frule_tac n = "- tna (v x) + (-1 - int n)" in npowf_mem[of t ], 
        assumption,
        frule_tac x = k in Vr_mem_f_mem[of v], assumption+)
 apply (simp add:Ring.ring_tOp_assoc npowf_exp_add[THEN sym, of t])
  apply (simp add:field_npowf_exp_zero) 
  apply (simp add:Ring.ring_r_one)

 apply (frule pj_Hom[of "Vr K v" "vp K v"], assumption+)
 apply (frule_tac a = k in rHom_mem[of "pj (Vr K v) (vp K v)" "Vr K v" 
        "Vr K v /r vp K v"], assumption+)
 apply (frule_tac x = "pj (Vr K v) (vp K v) k" in Ring.csrp_fn_mem[of "Vr K v" 
        "vp K v"], assumption+)
 apply (simp add:Vr_mem_f_mem)
 apply (rule npowf_mem, assumption+)

apply (simp add:Kxa_def) apply (erule bexE, simp)
apply (frule_tac x = k in Vr_mem_f_mem[of "v"], assumption+)
apply (frule_tac n = "tna (v x) + (1 + int n)" in npowf_mem[of "t"], 
       assumption+)
apply (frule_tac n = "- tna (v x) + (- 1 - int n)" in npowf_mem[of "t"], 
       assumption+)
apply (frule_tac x = "tK(tna (v x) + (1 + int n))" and y = k in 
      Ring.ring_tOp_commute[of "K"], assumption+) apply simp
apply (simp add:Ring.ring_tOp_assoc, simp add:npowf_exp_add[THEN sym])
   apply (simp add:field_npowf_exp_zero) 
   apply (simp add:Ring.ring_r_one)
   apply (thin_tac "(tK(tna (v x) + (1 + int n))) r k =
            k r (tK(tna (v x) + (1 + int n)))")
apply (frule pj_Hom[of "Vr K v" "vp K v"], assumption+)
apply (frule_tac a = k in rHom_mem[of "pj (Vr K v) (vp K v)" "Vr K v" 
        "Vr K v /r vp K v"], assumption+)
 apply (frule_tac x = "pj (Vr K v) (vp K v) k" in Ring.csrp_fn_mem[of "Vr K v" 
        "vp K v"], assumption+)
 apply (frule_tac x = "csrp_fn (Vr K v) (vp K v) (pj (Vr K v) (vp K v) k)" in 
        Vr_mem_f_mem[of v], assumption+)
 apply (frule_tac x = "csrp_fn (Vr K v) (vp K v) (pj (Vr K v) (vp K v) k)" and
 y = "tK(tna (v x) + (1 + int n))" in Ring.ring_tOp_closed[of "K"], assumption+)
 apply (simp add:aGroup.ag_p_inv[of "K"])
 apply (frule_tac x = "psum K x v t n" in aGroup.ag_mOp_closed[of "K"], 
          assumption+)
 apply (frule_tac x = "(csrp_fn (Vr K v) (vp K v)(pj (Vr K v) (vp K v) k)) r
       (tK(tna (v x) + (1 + int n)))" in aGroup.ag_mOp_closed[of "K"], assumption+)
 apply (subst aGroup.ag_pOp_assoc[THEN sym], assumption+)
 apply simp
 apply (simp add:Ring.ring_inv1_1)
 apply (subst Ring.ring_distrib2[THEN sym, of "K"], assumption+)
 apply (rule aGroup.ag_mOp_closed, assumption+)
 apply (frule_tac x = k in  Ring.csrp_diff_in_vpr[of "Vr K v" "vp K v"]
     , assumption+)
 apply (frule Ring.ring_is_ag[of "Vr K v"])
 apply (frule_tac x = "csrp_fn (Vr K v) (vp K v) (pj (Vr K v) (vp K v) k)" in 
        aGroup.ag_mOp_closed[of "Vr K v"], assumption+)
 apply (simp add:Vr_pOp_f_pOp) apply (simp add:Vr_mOp_f_mOp)
 apply (frule_tac x = "k ± -a (csrp_fn (Vr K v) (vp K v) (pj (Vr K v) (vp K v)
 k))" in vp_mem_times_t[of "v" "t"], assumption+, erule bexE, simp)
 apply (frule_tac x = a in Vr_mem_f_mem[of v], assumption+)
 apply (simp add:Ring.ring_tOp_assoc[of "K"])
 apply (simp add:npowf_exp_1_add[THEN sym, of "t"])
 apply (simp add:add.commute[of "2"])
 apply (simp add:add.assoc)
 apply (subst Ring.ring_tOp_commute, assumption+)
 apply (rule npowf_mem, assumption+) apply blast
done

lemma Suc_diff_int:"0 < n  int (n - Suc 0) = int n - 1" 
by (cut_tac of_nat_Suc[of "n - Suc 0"], simp)

lemma (in Corps) ecf_mem:"valuation K v; t  carrier K; v t = 1; 
      x  carrier K; x  𝟬    ecfK v t x n  carrier K"
apply (frule val1_neq_0[of v t], assumption+)
apply (cut_tac field_is_ring,
       frule Vr_ring[of v], frule vp_ideal[of v])
apply (case_tac "n = 0")
 apply (simp add:expand_coeff_def)
 apply (rule Vr_mem_f_mem[of v], assumption+)
 apply (rule Ring.csrp_fn_mem, assumption+)
 apply (subgoal_tac "x r (tK- tna (v x))  carrier (Vr K v)")
 apply (simp add:pj_mem Ring.qring_carrier, blast)
apply (frule npowf_mem[of  "t" "- tna (v x)"], assumption+,
       subst val_pos_mem_Vr[THEN sym, of v "x r (tK(- tna(v x)))"], 
       assumption+,
       rule Ring.ring_tOp_closed, assumption+) 
apply (simp add:val_t2p,
       simp add:val_exp[THEN sym, of  "v" "t" "- tna (v x)"]) 
apply (frule value_in_aug_inf[of  "v" "x"], assumption+,
       simp add:aug_inf_def)
      apply (frule val_nonzero_noninf[of  "v" "x"], assumption+)
  apply (simp add:aminus[THEN sym], simp add:ant_tna)
  apply (simp add:aadd_minus_r)

apply (simp add:expand_coeff_def) 
apply (frule psum_diff_mem_Kxa[of  "v" "t" "x" "n - 1"],
                   assumption+, erule conjE)
apply (simp add:Kxa_def, erule bexE,
       frule_tac x = k in Vr_mem_f_mem[of v], assumption+,
     frule npowf_mem[of  "t" "tna (v x) + (1 + int (n - Suc 0))"], 
     assumption+,
   frule npowf_mem[of  "t" "-tna (v x) - int n"], assumption+)
  apply simp
  apply (thin_tac "x ± -a psum K x v t (n - Suc 0) =
          (tK(tna (v x) + (1 + int (n - Suc 0)))) r k")
apply(simp add:Ring.ring_tOp_commute[of "K" "tK(tna (v x) + (1 + int (n - Suc 0)))"])
 apply (simp add:Ring.ring_tOp_assoc, simp add:npowf_exp_add[THEN sym])
 apply (thin_tac "tK(tna (v x) + (1 + int (n - Suc 0)))  carrier K",
        thin_tac "tK(- tna (v x) - int n)  carrier K")
 apply (simp add:Suc_diff_int[of "n"])
 apply (simp add:npowf_def, simp add:Ring.ring_r_one)
apply (rule Vr_mem_f_mem, assumption+)
 apply (rule Ring.csrp_fn_mem, assumption+)
 apply (simp add:pj_mem Ring.qring_carrier, blast)
done

lemma (in Corps) etm_mem:"valuation K v; t  carrier K; v t = 1; 
     x  carrier K; x  𝟬  etmK v t x n  carrier K"
apply (frule val1_neq_0[of v t], assumption+)
apply (simp add:expand_term_def)
apply (cut_tac field_is_ring,
       rule Ring.ring_tOp_closed[of "K"], assumption)
apply (simp add:ecf_mem)
apply (simp add:npowf_mem)
done

lemma (in Corps) psum_sum_etm:"valuation K v; t  carrier K; v t = 1; 
      x  carrier K; x  𝟬  
 psumK x v t n = nsum K (λj. (ecfK v t x j)r (tK(tna (v x) + (int j)))) n" 
apply (frule val1_neq_0[of v t], assumption+)
apply (induct_tac "n")
 apply (simp add:expand_coeff_def)
apply (rotate_tac -1, drule sym)
apply simp
 apply (thin_tac "Σe K (λj. ecfK v t x j r tK(tna (v x) + int j)) n =
         psum K x v t n")
 apply (simp add:expand_coeff_def)
done

lemma zabs_pos:"0  (abs (z::int))"
by (simp add:zabs_def)

lemma abs_p_self_pos:"0  z + (abs (z::int))"
by (simp add:zabs_def)

lemma zadd_right_mono:"(i::int)  j  i  + k  j  + k"
by simp

theorem (in Corps) expansion_thm:"valuation K v; t  carrier K; 
       v t = 1; x  carrier K; x  𝟬   limK v (partial_sum K x v t) x" 
apply (cut_tac field_is_ring, frule Ring.ring_is_ag[of "K"])
apply (simp add:limit_def)
 apply (rule allI)
 apply (subgoal_tac "n. (N + na (Abs (v x))) < n 
                     psumK x v t n ± -a x  vp K v(Vr K v) (an N)")
 apply blast
apply (rule allI, rule impI)
apply (frule_tac n = n in psum_diff_mem_Kxa[of "v" "t" "x"],
          assumption+, erule conjE) 
apply (frule_tac j = "tna (v x) + (1 + int n)" in  Kxa_val_ge[of "v" "t"], 
       assumption+)
 apply simp
 apply (thin_tac "Kxa K v (tK(tna (v x) + (1 + int n))) =
           {xa  carrier K. ant (tna (v x) + (1 + int n))  v xa}")
 apply (erule conjE)
 apply (simp add:a_zpz[THEN sym])

apply (subgoal_tac "(an N)  v (psum K x v t n ± -a x)")
 
 apply (frule value_in_aug_inf[of v x], assumption+,
       simp add:aug_inf_def)
      apply (frule val_nonzero_noninf[of v x], assumption+)
  apply (simp add:ant_tna)
 apply (frule val_surj_n_val[of v], blast)
apply (rule_tac x = "psumK x v t n ± -a x" and n = "an N" in 
                     n_value_x_2[of  "v"], assumption+) 
apply (subst val_pos_mem_Vr[THEN sym, of v], assumption+)
apply (rule aGroup.ag_pOp_closed[of "K"], assumption+)
apply (simp add:aGroup.ag_mOp_closed)

apply (cut_tac n = N in an_nat_pos)
apply (rule_tac i = 0 and j = "an N" and k = "v (psum K x v t n ± -a x)" in 
       ale_trans, assumption+)
apply simp
apply simp

apply (frule_tac x1 = "x ± (-a psumK x v t n)" in val_minus_eq[THEN sym,
      of v], assumption+, simp,
      thin_tac "v ( x ± -a psum K x v t n) = v (-a ( x ± -a psum K x v t n))")
 apply (frule_tac x = "psum K x v t n" in aGroup.ag_mOp_closed[of "K"],
        assumption+, simp add:aGroup.ag_p_inv, simp add:aGroup.ag_inv_inv)
 apply (frule aGroup.ag_mOp_closed[of "K" "x"], assumption+)
 apply (simp add:aGroup.ag_pOp_commute[of "K" "-a x"])

apply (cut_tac Abs_pos[of "v x"])
apply (frule val_nonzero_z[of v x], assumption+, erule exE, simp) 
apply (simp add:na_def) 
apply (cut_tac aneg_less[THEN sym, of "0" "Abs (v x)"], simp)
apply (frule val_nonzero_noninf[of v x], assumption+)
apply (simp add:tna_ant)
apply (simp only:ant_1[THEN sym], simp del:ant_1 add:a_zpz)
apply (simp add:add.assoc[THEN sym])
apply (cut_tac m1 = "N + nat ¦z¦" and n1 = n in of_nat_less_iff [where ?'a = int, THEN sym], simp)
apply (frule_tac a = "int N + abs z" and b = "int n" and c = "z + 1" in 
       add_strict_right_mono, simp only:add.commute)
apply (simp only:add.assoc[of _ "1"])
apply (simp only:add.assoc[THEN sym, of "1"])
apply (simp only:add.commute[of "1"])
apply (simp only:add.assoc[of _ "1"])
apply (cut_tac ?a1 = z and ?b1 = "abs z" and ?c1 = "1 + int N" in 
       add.assoc[THEN sym])
apply (thin_tac "¦z¦ + int N < int n")
apply (frule_tac a = "z + (¦z¦ + (1 + int N))" and b = "z + ¦z¦ + (1 + int N)" and c = "int n + (z + 1)" in ineq_conv1, assumption+)
apply (thin_tac "z + (¦z¦ + (1 + int N)) < int n + (z + 1)",
       thin_tac "z + (¦z¦ + (1 + int N)) = z + ¦z¦ + (1 + int N)",
       thin_tac "N + nat ¦z¦ < n")
apply (cut_tac z = z in abs_p_self_pos)
apply (frule_tac i = 0 and j = "z + abs z" and k = "1 + int N" in 
        zadd_right_mono) 
apply (simp only:add_0)
apply (frule_tac i = "1 + int N" and j = "z + ¦z¦ + (1 + int N)" and 
       k = "int n + (z + 1)" in zle_zless_trans, assumption+) 
apply (thin_tac "z + ¦z¦ + (1 + int N) < int n + (z + 1)",
       thin_tac "0  z + ¦z¦",
       thin_tac "1 + int N  z + ¦z¦ + (1 + int N)")
apply (cut_tac m1 = "1 + int N" and n1 = "int n + (z + 1)" in 
       aless_zless[THEN sym], simp)

apply (frule_tac x = "ant (1 + int N)" and y = "ant (int n + (z + 1))"
       and z = "v ( psum K x v t n ± -a x)" in aless_le_trans, assumption+)
apply (thin_tac "ant (1 + int N) < ant (int n + (z + 1))")

apply (simp add:a_zpz[THEN sym])
apply (frule_tac x = "1 + ant (int N)" and y = "v ( psum K x v t n ± -a x)" in 
       aless_imp_le, thin_tac "1 + ant (int N) < v ( psum K x v t n ± -a x)")
apply (cut_tac a0_less_1, frule aless_imp_le[of "0" "1"])
apply (frule_tac b = "ant (int N)" in aadd_pos_le[of "1"])
apply (subst an_def)
apply (rule_tac i = "ant (int N)" and j = "1 + ant (int N)" and 
       k = "v ( psum K x v t n ± -a x)" in ale_trans, assumption+)
done

subsection "Hensel's theorem"

definition
(*** Cauchy sequence of polynomials in (Vr K v)[X] ***)
  pol_Cauchy_seq :: "[('b, 'm) Ring_scheme, 'b, _, 'b  ant, 
         nat  'b]  bool" ("(5PCauchy⇘ _ _ _ _ _)" [90,90,90,90,91]90) where
  "PCauchyR X K v F  (n. (F n)  carrier R)  
    (d. (n. deg R (Vr K v) X (F n)  (an d))) 
    (N. M. (n m. M < n  M < m   
        P_mod R (Vr K v) X ((vp K v)(Vr K v) (an N)) (F n ±R -aR (F m))))"

definition
  pol_limit :: "[('b, 'm) Ring_scheme, 'b, _, 'b  ant, 
             nat  'b, 'b]  bool" 
             ("(6Plimit⇘ _ _ _ _ _ _)" [90,90,90,90,90,91]90) where
  "PlimitR X K v F p  (n. (F n)  carrier R)  
    (N. M. (m. M < m   
        P_mod R (Vr K v) X ((vp K v)(Vr K v) (an N)) ((F m) ±R -aR p)))"

definition
  Pseql :: "[('b, 'm) Ring_scheme, 'b, _, 'b  ant, nat, 
             nat  'b]  nat  'b" 
            ("(6Pseql⇘_  _ _ _ _ _)" [90,90,90,90,90,91]90) where
  "PseqlR X K v d F = (λn. (ldeg_p R (Vr K v) X d (F n)))"

   (** deg R (Vr K v) X (F n) ≤ an (Suc d) **)

definition
  Pseqh :: "[('b, 'm) Ring_scheme, 'b, _, 'b  ant, nat, nat  'b]   
        nat  'b" 
           ("(6Pseqh⇘ _ _ _ _ _ _)" [90,90,90,90,90,91]90) where
  "PseqhR X K v d F = (λn. (hdeg_p R (Vr K v) X (Suc d) (F n)))"

    (** deg R (Vr K v) X (F n) ≤ an (Suc d) **)

lemma an_neq_minf[simp]:"n. -  an n"
apply (rule allI)
apply (simp add:an_def) apply (rule not_sym) apply simp
done

lemma an_neq_minf1[simp]:"n. an n  -" 
apply (rule allI) apply (simp add:an_def)
done

lemma (in Corps) Pseql_mem:"valuation K v; PolynRg R (Vr K v) X;
      F n  carrier R; n. deg R (Vr K v) X (F n)  an (Suc d) 
                     (PseqlR X K v d F) n  carrier R"
apply (frule PolynRg.is_Ring)
apply (simp add:Pseql_def)
apply (frule Vr_ring[of "v"], 
       rule PolynRg.ldeg_p_mem, assumption+, simp)
done

lemma (in Corps) Pseqh_mem:"valuation K v; PolynRg R (Vr K v) X;
      F n  carrier R; n. deg R (Vr K v) X (F n)  an (Suc d) 
                     (PseqhR X K v d F) n  carrier R"
apply (frule PolynRg.is_Ring)
apply (frule Vr_ring[of "v"]) 
apply (frule PolynRg.subring[of "R" "Vr K v" "X"])
apply (frule PolynRg.X_mem_R[of "R" "Vr K v" "X"])
apply (simp del:npow_suc add:Pseqh_def)
apply (rule PolynRg.hdeg_p_mem, assumption+, simp)
done

lemma (in Corps) PCauchy_lTr:"valuation K v; PolynRg R (Vr K v) X;
    p  carrier R; deg R (Vr K v) X p  an (Suc d); 
    P_mod R (Vr K v) X (vp K v(Vr K v) (an N)) p 
    P_mod R (Vr K v) X (vp K v(Vr K v) (an N)) (ldeg_p R (Vr K v) X d p)"
apply (frule PolynRg.is_Ring)
apply (simp add:ldeg_p_def)
apply (frule Vr_ring[of v])
apply (frule PolynRg.scf_d_pol[of "R" "Vr K v" "X" "p" "Suc d"], assumption+,
       (erule conjE)+)
apply (frule_tac n = "an N" in vp_apow_ideal[of v], simp)
apply (frule PolynRg.P_mod_mod[THEN sym, of R "Vr K v" X "vp K v (Vr K v) (an N)"
       p "scf_d R (Vr K v) X p (Suc d)"], assumption+, simp)
apply (subst PolynRg.polyn_expr_short[of R "Vr K v" X 
             "scf_d R (Vr K v) X p (Suc d)" d], assumption+, simp)
apply (subst PolynRg.P_mod_mod[THEN sym, of R "Vr K v" X "vp K v (Vr K v) (an N)"
       "polyn_expr R X d (d, snd (scf_d R (Vr K v) X p (Suc d)))" 
       "(d, snd (scf_d R (Vr K v) X p (Suc d)))"], assumption+)
apply (subst PolynRg.polyn_expr_short[THEN sym], simp+,
       simp add:PolynRg.polyn_mem)
apply (subst pol_coeff_def, rule allI, rule impI, 
       simp add:PolynRg.pol_coeff_mem)
apply simp+
done

lemma (in Corps) PCauchy_hTr:"valuation K v; PolynRg R (Vr K v) X;
      p  carrier R; deg R (Vr K v) X p  an (Suc d); 
      P_mod R (Vr K v) X (vp K v(Vr K v) (an N)) p
   P_mod R (Vr K v) X (vp K v(Vr K v) (an N)) (hdeg_p R (Vr K v) X (Suc d) p)"
apply (frule PolynRg.is_Ring)
apply (cut_tac Vr_ring[of v])
apply (frule PolynRg.scf_d_pol[of R "Vr K v" X p "Suc d"], assumption+)
apply (frule_tac n = "an N" in vp_apow_ideal[of v], simp)
apply (frule PolynRg.P_mod_mod[THEN sym, of "R" "Vr K v" "X" 
       "vp K v (Vr K v) (an N)" p "scf_d R (Vr K v) X p (Suc d)"], assumption+,
       simp+)
apply (subst hdeg_p_def) 
apply (subst PolynRg.monomial_P_mod_mod[THEN sym, of "R" "Vr K v" "X" 
       "vp K v (Vr K v) (an N)" "snd (scf_d R (Vr K v) X p (Suc d)) (Suc d)" 
       "(snd (scf_d R (Vr K v) X p (Suc d)) (Suc d)) rR (X^R (Suc d))" 
       "Suc d"], 
       assumption+)
apply (rule PolynRg.pol_coeff_mem[of R "Vr K v" X 
       "scf_d R (Vr K v) X p (Suc d)" "Suc d"], assumption+, simp+)
done
 
lemma (in Corps) v_ldeg_p_pOp:"valuation K v; PolynRg R (Vr K v) X; 
      p  carrier R; q  carrier R; deg R (Vr K v) X p  an (Suc d); 
      deg R (Vr K v) X q  an (Suc d) 
      (ldeg_p R (Vr K v) X d p) ±R (ldeg_p R (Vr K v) X d q) =
                              ldeg_p R (Vr K v) X d (p ±R q)"
by (simp add:PolynRg.ldeg_p_pOp[of R "Vr K v" X p q d]) 

lemma (in Corps) v_hdeg_p_pOp:"valuation K v; PolynRg R (Vr K v) X; 
      p  carrier R; q  carrier R; deg R (Vr K v) X p  an (Suc d); 
      deg R (Vr K v) X q  an (Suc d)  (hdeg_p R (Vr K v) X (Suc d) p) ±R 
      (hdeg_p R (Vr K v) X (Suc d) q) = hdeg_p R (Vr K v) X (Suc d) (p ±R q)"
by (simp add:PolynRg.hdeg_p_pOp[of R "Vr K v" X p q d])

lemma (in Corps) v_ldeg_p_mOp:"valuation K v; PolynRg R (Vr K v) X; 
       p  carrier R;deg R (Vr K v) X p  an (Suc d)  
       -aR (ldeg_p R (Vr K v) X d p) = ldeg_p R (Vr K v) X d (-aR p)"
by (simp add:PolynRg.ldeg_p_mOp)


lemma (in Corps) v_hdeg_p_mOp:"valuation K v; PolynRg R (Vr K v) X; 
    p  carrier R;deg R (Vr K v) X p  an (Suc d) 
   -aR (hdeg_p R (Vr K v) X (Suc d) p) = hdeg_p R (Vr K v) X (Suc d) (-aR p)"
by (simp add:PolynRg.hdeg_p_mOp)

lemma (in Corps) PCauchy_lPCauchy:"valuation K v; PolynRg R (Vr K v) X; 
      n. F n  carrier R;  n. deg R (Vr K v) X (F n)  an (Suc d); 
      P_mod R (Vr K v) X (vp K v(Vr K v) (an N)) (F n ±R -aR (F m))
       P_mod R (Vr K v) X (vp K v(Vr K v) (an N))
                     (((PseqlR X K v d F) n) ±R -aR ((PseqlR X K v d F) m))"
apply (frule PolynRg.is_Ring)
apply (cut_tac Vr_ring[of v],
       frule Ring.ring_is_ag[of "R"],
       frule PolynRg.subring[of "R" "Vr K v" "X"])
apply (simp add:Pseql_def)
apply (subst v_ldeg_p_mOp[of "v" "R" "X" _ "d"], assumption+,
       simp, simp)
apply (subst v_ldeg_p_pOp[of v R X "F n" "-aR (F m)"], assumption+,
       simp, rule aGroup.ag_mOp_closed, assumption, simp, simp,
       simp add:PolynRg.deg_minus_eq1)
apply (rule PCauchy_lTr[of v R X "F n ±R -aR (F m)" "d" "N"],
       assumption+,
       rule aGroup.ag_pOp_closed[of "R" "F n" "-aR (F m)"], assumption+,
       simp, rule aGroup.ag_mOp_closed, assumption+, simp)
apply (frule PolynRg.deg_minus_eq1 [of "R" "Vr K v" "X" "F m"], simp)
apply (rule PolynRg.polyn_deg_add4[of "R" "Vr K v" "X" "F n" 
       "-aR (F m)" "Suc d"], assumption+, simp,
       rule aGroup.ag_mOp_closed, assumption, simp+)
done

lemma (in Corps) PCauchy_hPCauchy:"valuation K v; PolynRg R (Vr K v) X;
      n. F n  carrier R; n. deg R (Vr K v) X (F n)  an (Suc d); 
      P_mod R (Vr K v) X (vp K v(Vr K v) (an N)) (F n ±R -aR (F m))
       P_mod R (Vr K v) X (vp K v(Vr K v) (an N))
                     (((PseqhR X K v d F) n) ±R -aR ((PseqhR X K v d F) m))"
apply (frule PolynRg.is_Ring)
apply (frule Vr_ring[of v], frule Ring.ring_is_ag[of "R"],
       frule PolynRg.subring[of "R" "Vr K v" "X"], 
       frule vp_apow_ideal[of v "an N"], simp) 

apply (simp add:Pseqh_def,
       subst v_hdeg_p_mOp[of v R X "F m" "d"], assumption+,
       simp+)

apply (subst v_hdeg_p_pOp[of v R X "F n" "-aR (F m)"], assumption+,
       simp, rule aGroup.ag_mOp_closed, assumption, simp, simp,
       frule PolynRg.deg_minus_eq1 [of "R" "Vr K v" "X" "F m"],
       simp+ )
apply (frule PCauchy_hTr[of "v" "R" "X" "F n ±R -aR (F m)" "d" "N"],
    assumption+,
    rule aGroup.ag_pOp_closed[of "R" "F n" "-aR (F m)"], assumption+,
    simp, rule aGroup.ag_mOp_closed, assumption+, simp)
apply (frule PolynRg.deg_minus_eq1 [of "R" "Vr K v" "X" "F m"], simp+)
apply (rule PolynRg.polyn_deg_add4[of "R" "Vr K v" "X" "F n" "-aR (F m)" 
       "Suc d"], assumption+,
       simp, rule aGroup.ag_mOp_closed, assumption, simp+)
done

(** Don't forget  t_vp_apow  ***)
 
lemma (in Corps) Pseq_decompos:"valuation K v; PolynRg R (Vr K v) X;
      F n  carrier R; deg R (Vr K v) X (F n)  an (Suc d)
       F n = ((PseqlR X K v d F) n) ±R ((PseqhR X K v d F) n)"
apply (frule PolynRg.is_Ring)
apply (simp del:npow_suc add:Pseql_def Pseqh_def)
apply (frule Vr_ring[of v])
apply (frule PolynRg.subring[of "R" "Vr K v" "X"])
apply (rule PolynRg.decompos_p[of "R" "Vr K v" "X" "F n" "d"], assumption+)
done

lemma (in Corps) deg_0_const:"valuation K v; PolynRg R (Vr K v) X;
      p  carrier R; deg R (Vr K v) X p  0  p  carrier (Vr K v)"
apply (frule Vr_ring[of v])
apply (frule PolynRg.subring)
apply (frule PolynRg.is_Ring)
apply (case_tac "p = 𝟬R", simp,
       simp add:Ring.Subring_zero_ring_zero[THEN sym],
       simp add:Ring.ring_zero)
apply (subst PolynRg.pol_of_deg0[THEN sym, of "R" "Vr K v" "X" "p"], 
        assumption+)
apply (simp add:PolynRg.deg_an, simp only:an_0[THEN sym])
apply (simp only:ale_nat_le[of "deg_n R (Vr K v) X p" "0"])
done

lemma (in Corps) monomial_P_limt:"valuation K v; Completev K; 
     PolynRg R (Vr K v) X; n. f n  carrier (Vr K v);
     n. F n = (f n) rR (X^R d);  N. M. n m. M < n  M < m 
     P_mod R (Vr K v) X (vp K v(Vr K v) (an N)) (F n ±R -aR (F m))  
        bcarrier (Vr K v). Plimit R X K v F (b rR (X^R d))"
apply (frule PolynRg.is_Ring)
apply (frule Vr_ring[of v])
apply (frule PolynRg.subring[of "R" "Vr K v" "X"])
apply simp

apply (subgoal_tac "Cauchy K v f")
 apply (simp add:v_complete_def)
 apply (drule_tac a = f in forall_spec)
 apply (thin_tac "N. M. n m. M < n  M < m 
        P_mod R (Vr K v) X (vp K v(Vr K v) (an N))
        ((f n) rR (X^R d) ±R -aR (f m) rR (X^R d))", assumption)
 apply (erule exE, erule conjE)
 apply (subgoal_tac "b  carrier (Vr K v)")
 apply (subgoal_tac "Plimit R X K v F (b rR (X^R d))", blast)
 
(******* b ∈ carrier (Vr K v) ***********)
apply (simp add:pol_limit_def)
apply (rule conjI)
 apply (rule allI)
 apply (rule Ring.ring_tOp_closed[of "R"], assumption)
 apply (frule PolynRg.subring[of "R" "Vr K v" "X"])
 apply (rule Ring.mem_subring_mem_ring[of "R" "Vr K v"], assumption+) 
 apply simp
 
 apply (frule PolynRg.X_mem_R[of "R" "Vr K v" "X"])
 apply (simp add:Ring.npClose)
apply (thin_tac "n. F n = f n rR X^R d") 
apply (simp add:limit_def)
 apply (rule allI)
(* apply (simp add:t_vp_apow[of "K" "v" "t"]) *) 
 apply (rotate_tac -2, drule_tac x = N in spec) 
 apply (erule exE)
 apply (subgoal_tac "n> M. P_mod R (Vr K v) X (vp K v (Vr K v) (an N))
                   ((f n)rR (X^R d) ±R -aR (b rR (X^R d)))", blast) 
 apply (rule allI, rule impI)
 apply (rotate_tac -2, drule_tac x = n in spec, simp)
 apply (drule_tac x = n in spec)

apply (frule_tac x = "f n" in Ring.mem_subring_mem_ring[of "R" "Vr K v"], 
       assumption+,
       frule_tac x = b in Ring.mem_subring_mem_ring[of "R" "Vr K v"], 
       assumption+)
apply (frule PolynRg.X_mem_R[of "R" "Vr K v" "X"])
 apply (frule Ring.npClose[of "R" "X" "d"], assumption+)
 apply (simp add:Ring.ring_inv1_1)
 apply (frule Ring.ring_is_ag[of "R"],
        frule_tac x = b in aGroup.ag_mOp_closed[of "R"], assumption+)
 apply (subst Ring.ring_distrib2[THEN sym, of "R" "X^R d"], assumption+)

 apply (frule_tac n = "an N" in vp_apow_ideal[of v], simp) 
 apply (frule_tac I = "vp K v (Vr K v) (an N)" and c = "f n ±R -aR b" and 
        p = "(f n ±R -aR b) rR (X^R d)" in  
        PolynRg.monomial_P_mod_mod[of "R" "Vr K v" "X" _ _ _ "d"], assumption+)
 apply (simp add:Ring.Subring_minus_ring_minus[THEN sym])
 apply (frule Ring.ring_is_ag[of "Vr K v"])
 apply (frule_tac x = b in aGroup.ag_mOp_closed[of "Vr K v"], assumption+)
 apply (simp only:Ring.Subring_pOp_ring_pOp[THEN sym])
 apply (rule aGroup.ag_pOp_closed, assumption+) apply simp
 apply (frule_tac I1 = "vp K v (Vr K v) (an N)" and c1 = "f n ±R -aR b" and 
     p1 = "(f n ±R -aR b) rR (X^R d)" in PolynRg.monomial_P_mod_mod[THEN sym, 
     of "R" "Vr K v" "X" _ _ _ "d"], assumption+)
 apply (frule Ring.ring_is_ag[of "Vr K v"])
 apply (frule_tac x = b in aGroup.ag_mOp_closed[of "Vr K v"], assumption+)
 apply (simp only:Ring.Subring_minus_ring_minus[THEN sym])
 apply (simp only:Ring.Subring_pOp_ring_pOp[THEN sym])
 apply (rule aGroup.ag_pOp_closed, assumption+) apply simp apply simp
 apply (simp only:Vr_mOp_f_mOp[THEN sym])
 apply (frule Ring.ring_is_ag[of "Vr K v"])
 apply (frule_tac x = b in aGroup.ag_mOp_closed[of "Vr K v"], assumption+)
 apply (simp add:Vr_pOp_f_pOp[THEN sym])
 apply (simp add:Ring.Subring_pOp_ring_pOp)
 apply (simp add:Ring.Subring_minus_ring_minus)

 apply (case_tac "b = 𝟬K", simp add:Vr_0_f_0[THEN sym], 
        simp add:Ring.ring_zero)
 apply (frule_tac b = b in limit_val[of  _ "f" "v"], assumption+,
        rule allI,
        frule_tac x = j in spec, simp add:Vr_mem_f_mem,
        assumption+, erule exE)
 apply (thin_tac "n. F n = f n rR X^R d",
        thin_tac "N. M. n m. M < n  M < m 
                         P_mod R (Vr K v) X (vp K v (Vr K v) (an N))
                          (f n rR X^R d ±R -aR f m rR X^R d)")  
 apply (rotate_tac -1, drule_tac x = "Suc N" in spec, simp)
 apply (drule_tac x = "Suc N" in spec)
 apply (frule_tac x1 = "f (Suc N)" in val_pos_mem_Vr[THEN sym, of v],
        simp add:Vr_mem_f_mem, simp, simp add:val_pos_mem_Vr[of v]) 

apply (simp add:Cauchy_seq_def)
 apply (simp add:Vr_mem_f_mem)
 apply (rule allI)
 apply (rotate_tac -3, frule_tac x = N in spec)

 apply (thin_tac "n. F n = f n rR X^R d")
 (*apply (simp add:t_vp_apow[of "K" "v" "t"]) *) 
 apply (frule_tac n = "an N" in vp_apow_ideal[of "v"], simp)
 apply (drule_tac x = N in spec, erule exE) 
 apply (subgoal_tac "n m. M < n  M < m 
                      f n ± -a (f m)  vp K v (Vr K v) (an N)", blast)
 apply (rule allI)+
 apply (rule impI, erule conjE)
 apply (frule_tac I = "vp K v (Vr K v) (an N)" and c = "f n ± -a (f m)" and 
   p = "(f n ± -a (f m)) rR (X^R d)" in
   PolynRg.monomial_P_mod_mod[of "R" "Vr K v" "X" _ _ _ "d"], assumption+)
 
 apply (frule_tac x = n in spec,
        drule_tac x = m in spec)
 apply (frule Ring.ring_is_ag[of "Vr K v"],
        simp add:Vr_mOp_f_mOp[THEN sym],
        frule_tac x = "f m" in aGroup.ag_mOp_closed[of "Vr K v"], assumption+,
        simp add:Vr_pOp_f_pOp[THEN sym])
 apply (rule aGroup.ag_pOp_closed, assumption+, simp)
 apply simp 
 apply (thin_tac "(f n ± -a f m  vp K v (Vr K v) (an N)) =
        P_mod R (Vr K v) X (vp K v (Vr K v) (an N)) ((f n ± -a f m) rR X^R d)")
 apply (rotate_tac -3, drule_tac x = n in spec,
        rotate_tac -1, drule_tac x = m in spec, simp)
 apply (frule_tac x = n in spec,
        drule_tac x = m in spec)
 apply (frule_tac x = "f n" in Ring.mem_subring_mem_ring[of R "Vr K v"],
         assumption+,
        frule_tac x = "f m" in Ring.mem_subring_mem_ring[of R "Vr K v"],
         assumption+,
        frule Ring.ring_is_ag[of R],
        frule_tac x = "f m" in aGroup.ag_mOp_closed[of R], assumption+,
        frule PolynRg.X_mem_R[of R "Vr K v" X],
        frule Ring.npClose[of R X d], assumption)
 apply (simp add:Ring.ring_inv1_1[of R],
        frule_tac y1 = "f n" and z1 = "-aR f m" in Ring.ring_distrib2[
        THEN sym, of R "X^R d"], assumption+, simp,
        thin_tac "f n rR X^R d ±R (-aR f m) rR X^R d =
                                           (f n ±R -aR f m) rR X^R d")
 apply (simp only:Ring.Subring_minus_ring_minus[THEN sym,of R "Vr K v"])
 apply (frule Ring.subring_Ring[of R "Vr K v"], assumption,
        frule Ring.ring_is_ag[of "Vr K v"],
        frule_tac x = "f m" in aGroup.ag_mOp_closed[of "Vr K v"], assumption+)
 apply (simp add:Ring.Subring_pOp_ring_pOp[THEN sym, of R "Vr K v"],
        simp add:Vr_pOp_f_pOp, simp add:Vr_mOp_f_mOp)
done

lemma (in Corps) mPlimit_uniqueTr:"valuation K v; 
     PolynRg R (Vr K v) X; n. f n  carrier (Vr K v);
     n. F n = (f n) rR (X^R d); c  carrier (Vr K v);
     Plimit R X K v F (c rR (X^R d))   lim K v f c" 
apply (frule PolynRg.is_Ring,
       simp add:pol_limit_def limit_def,
       rule allI,
       erule conjE,
       rotate_tac -1, drule_tac x = N in spec,
       erule exE)
apply (subgoal_tac "n. M < n  f n ± -a c  vp K v (Vr K v) (an N)", blast)
apply (rule allI, rule impI,
       rotate_tac -2, drule_tac x = n in spec, simp,
       drule_tac x = n in spec,
       drule_tac x = n in spec,
       thin_tac "n. f n rR X^R d  carrier R")
apply (frule Vr_ring[of v],
       frule PolynRg.X_mem_R[of "R" "Vr K v" "X"],
       frule Ring.npClose[of "R" "X" "d"], assumption+,
       frule PolynRg.subring[of "R" "Vr K v" "X"])
apply (frule_tac x = c in Ring.mem_subring_mem_ring[of "R" "Vr K v"], 
       assumption+,
      frule_tac x = "f n" in Ring.mem_subring_mem_ring[of "R" "Vr K v"], 
       assumption+)
apply (simp add:Ring.ring_inv1_1,
       frule Ring.ring_is_ag[of "R"], 
       frule aGroup.ag_mOp_closed[of "R" "c"], assumption+)
apply (simp add:Ring.ring_distrib2[THEN sym, of "R" "X^R d" _ "-aR c"],
       simp add:Ring.Subring_minus_ring_minus[THEN sym],
       frule Ring.ring_is_ag[of "Vr K v"],
       frule aGroup.ag_mOp_closed[of "Vr K v" "c"], assumption+)
apply (simp add:Ring.Subring_pOp_ring_pOp[THEN sym],
       frule_tac x = "f n" in aGroup.ag_pOp_closed[of "Vr K v" _ 
        "-a(Vr K v) c"], assumption+,
       frule_tac n = "an N" in vp_apow_ideal[of "v"], simp,
       frule_tac I1 = "vp K v (Vr K v) (an N)" and 
        c1 = "f n ±(Vr K v) -a(Vr K v) c" and p1 = "(f n ±(Vr K v) -a(Vr K v) c)
       rR (X^R d)" in PolynRg.monomial_P_mod_mod[THEN sym, of R "Vr K v" 
        X _ _ _ d], assumption+, simp, simp)
 apply (simp add:Vr_pOp_f_pOp, simp add:Vr_mOp_f_mOp)
done

lemma (in Corps) mono_P_limt_unique:"valuation K v; 
  PolynRg R (Vr K v) X; n. f n  carrier (Vr K v); 
  n. F n = (f n) rR (X^R d); b  carrier (Vr K v); c  carrier (Vr K v);
  Plimit R X K v F (b rR (X^R d)); Plimit R X K v F (c rR (X^R d))  
        b  rR (X^R d) = c rR (X^R d)" 
apply (frule PolynRg.is_Ring)
apply (frule_tac mPlimit_uniqueTr[of v R X f F d b], assumption+,
       frule_tac mPlimit_uniqueTr[of v R X f F d c], assumption+)
apply (frule Vr_ring[of v],
       frule PolynRg.subring[of "R" "Vr K v" "X"],
       frule Vr_mem_f_mem[of v b], assumption+,
       frule Vr_mem_f_mem[of v c], assumption+,
       frule limit_unique[of b f v c])
apply (rule allI, simp add:Vr_mem_f_mem, assumption+, simp)
done 

lemma (in Corps) Plimit_deg:"valuation K v; PolynRg R (Vr K v) X; 
  n. F n  carrier R; n. deg R (Vr K v) X (F n)  (an d); 
  p  carrier R; Plimit R X K v F p   deg R (Vr K v) X p  (an d)"
apply (frule PolynRg.is_Ring, frule Vr_ring[of v])
apply (case_tac "p = 𝟬R", simp add:deg_def)
apply (rule contrapos_pp, simp+,
       simp add:aneg_le,
       frule PolynRg.s_cf_expr[of R "Vr K v" X p], assumption+, (erule conjE)+,
       frule PolynRg.s_cf_deg[of R "Vr K v" X p], assumption+,
       frule PolynRg.pol_coeff_mem[of R "Vr K v" X "s_cf R (Vr K v) X p" 
        "fst (s_cf R (Vr K v) X p)"], assumption+, simp,
       frule Vr_mem_f_mem[of v "snd (s_cf R (Vr K v) X p) 
            (fst (s_cf R (Vr K v) X p))"], assumption+)
(* show the value of the leading coefficient is noninf *)
apply (frule val_nonzero_noninf[of "v" 
       "snd (s_cf R (Vr K v) X p) (fst (s_cf R (Vr K v) X p))"], assumption,
       simp add:Vr_0_f_0,
       frule val_pos_mem_Vr[THEN sym, of v "snd (s_cf R (Vr K v) X p) 
         (fst (s_cf R (Vr K v) X p))"], assumption+, simp,
       frule value_in_aug_inf[of "v" "snd (s_cf R (Vr K v) X p) 
          (fst (s_cf R (Vr K v) X p))"], assumption+,
       cut_tac mem_ant[of "v (snd (s_cf R (Vr K v) X p) 
       (fst (s_cf R (Vr K v) X p)))"], simp add:aug_inf_def,
       erule exE, simp, simp only:ant_0[THEN sym], simp only:ale_zle,
       frule_tac z = z in zpos_nat, erule exE, simp,
       thin_tac "z = int n")

(* show that the leading coefficient of p shoule be 0. contradiction *)
apply (simp add:pol_limit_def)
apply (rotate_tac 5, drule_tac x = "Suc n" in spec) 
apply (erule exE)
apply (rotate_tac -1, 
       drule_tac x = "Suc M" in spec, simp del:npow_suc,
       drule_tac x = "Suc M" in spec, 
       drule_tac x = "Suc M" in spec)

  (**** Only formula manipulation to obtain
        P_mod R (Vr K v) X (vp K v Vr K v an (Suc n))
         (polyn_expr R X (fst (s_cf R (Vr K v) X p))
           (add_cf (Vr K v) f
             (fst (s_cf R (Vr K v) X p),
              λj. -aVr K v snd (s_cf R (Vr K v) X p) j))) *****)
apply (frule PolynRg.polyn_minus[of R "Vr K v" X "s_cf R (Vr K v) X p" 
       "fst (s_cf R (Vr K v) X p)"], assumption+, simp,
   frule PolynRg.minus_pol_coeff[of R "Vr K v" X "s_cf R (Vr K v) X p"],
        assumption+, drule sym,
   frule_tac x = "deg R (Vr K v) X (F (Suc M))" in ale_less_trans[of _ 
       "an d" "deg R (Vr K v) X p"], assumption+,
   frule_tac p = "F (Suc M)" and d = "deg_n R (Vr K v) X p" in 
            PolynRg.pol_expr_edeg[of "R" "Vr K v" "X"], assumption+,
   frule_tac x = "deg R (Vr K v) X (F (Suc M))" and 
         y = "deg R (Vr K v) X p" in aless_imp_le,
      subst PolynRg.deg_an[THEN sym, of "R" "Vr K v" "X" "p"], assumption+,
      erule exE, (erule conjE)+,
   frule_tac c = f in PolynRg.polyn_add1[of "R" "Vr K v" "X" _ 
    "(fst (s_cf R (Vr K v) X p), λj. -aVr K v snd (s_cf R (Vr K v) X p) j)"],
    assumption+, simp,
   thin_tac "-aR p = polyn_expr R X (fst (s_cf R (Vr K v) X p))
    (fst (s_cf R (Vr K v) X p), λj. -aVr K v snd (s_cf R (Vr K v) X p) j)",
   thin_tac "polyn_expr R X (fst (s_cf R (Vr K v) X p))
             (s_cf R (Vr K v) X p) = p",
   thin_tac "F (Suc M) = polyn_expr R X (fst (s_cf R (Vr K v) X p)) f",
   thin_tac "polyn_expr R X (fst (s_cf R (Vr K v) X p)) f ±R
       polyn_expr R X (fst (s_cf R (Vr K v) X p))
        (fst (s_cf R (Vr K v) X p), λj. -aVr K v snd (s_cf R (Vr K v) X p) j) =
       polyn_expr R X (fst (s_cf R (Vr K v) X p)) (add_cf (Vr K v) f
       (fst (s_cf R (Vr K v) X p), λj. -aVr K v snd (s_cf R (Vr K v) X p) j))")

(** apply P_mod_mod to obtain a condition of coefficients **) 
 apply (frule_tac n = "an (Suc n)" in vp_apow_ideal[of "v"], simp,
   frule_tac p1 = "polyn_expr R X (fst (s_cf R (Vr K v) X p))(add_cf (Vr K v) f
   (fst (s_cf R (Vr K v) X p), λj. -aVr K v snd (s_cf R (Vr K v) X p) j))" and
  I1= "vp K v (Vr K v) (an (Suc n))" and c1 = "add_cf (Vr K v) f (fst 
   (s_cf R (Vr K v) X p), λj. -aVr K v snd (s_cf R (Vr K v) X p) j)" in 
  PolynRg.P_mod_mod[THEN sym, of R "Vr K v" X], assumption+,
  rule PolynRg.polyn_mem[of R "Vr K v" X], assumption+,
  rule PolynRg.add_cf_pol_coeff[of R "Vr K v" X], assumption+,
  simp add:PolynRg.add_cf_len,
  rule PolynRg.add_cf_pol_coeff[of R "Vr K v" X], assumption+,
  simp add:PolynRg.add_cf_len,
  simp add:PolynRg.add_cf_len)
 apply (drule_tac x = "fst (s_cf R (Vr K v) X p)" in spec, simp,
        thin_tac "P_mod R (Vr K v) X (vp K v (Vr K v) (an (Suc n)))
         (polyn_expr R X (fst (s_cf R (Vr K v) X p)) (add_cf (Vr K v) f
      (fst (s_cf R (Vr K v) X p), λj. -aVr K v snd (s_cf R (Vr K v) X p) j)))",
      simp add:add_cf_def)
 (**** we obtained snd (add_cf (Vr K v) f (fst (s_cf R (Vr K v) X p),
     λj. -aVr K v snd (s_cf R (Vr K v) X p) j)) (fst (s_cf R (Vr K v) X p))
           ∈ vp K v Vr K v an (Suc n)   ***)
 apply (frule_tac p = "polyn_expr R X (fst (s_cf R (Vr K v) X p)) f" and 
       c = f and j = "fst f" in PolynRg.pol_len_gt_deg[of R "Vr K v" X],
       assumption+, simp, drule sym, simp add:PolynRg.deg_an) apply simp
 apply (rotate_tac -4, drule sym, simp)
 apply (frule Ring.ring_is_ag[of "Vr K v"],
        frule_tac x = "snd (s_cf R (Vr K v) X p) (fst f)" in 
        aGroup.ag_mOp_closed[of "Vr K v"], assumption+,
        simp add:aGroup.ag_l_zero) 
 apply (frule_tac I = "vp K v (Vr K v) (an (Suc n))" and 
        x = "-aVr K v snd (s_cf R (Vr K v) X p) (fst f)" in 
        Ring.ideal_inv1_closed[of "Vr K v"], assumption+)
 apply (simp add:aGroup.ag_inv_inv)
 apply (frule_tac n = "an (Suc n)" and x = "snd (s_cf R (Vr K v) X p) (fst f)"
         in n_value_x_1[of v], simp+)    
 apply (frule_tac x = "snd (s_cf R (Vr K v) X p) (fst f)" in 
         n_val_le_val[of v], assumption+, simp add:ant_int) 
 apply (drule_tac i = "an (Suc n)" and 
        j = "n_val K v (snd (s_cf R (Vr K v) X p) (fst f))" and
        k = "v (snd (s_cf R (Vr K v) X p) (fst f))" in ale_trans,
        assumption+)
 apply (simp add:ant_int ale_natle)
done

lemma (in Corps) Plimit_deg1:"valuation K v; Ring R; PolynRg R (Vr K v) X; 
  n. F n  carrier R; n. deg R (Vr K v) X (F n)  ad; 
  p  carrier R; Plimit R X K v F p   deg R (Vr K v) X p  ad"
apply (frule Vr_ring[of v])
apply (case_tac "n. F n = 𝟬R")
apply (frule Plimit_deg[of v R X F 0 p], assumption+,
       rule allI, simp add:deg_def, assumption+)
apply (case_tac "p = 𝟬R", simp add:deg_def,
       frule PolynRg.nonzero_deg_pos[of R "Vr K v" X p], assumption+,
       simp,
       frule PolynRg.pols_const[of "R" "Vr K v" "X" "p"], assumption+,
       simp,
       frule PolynRg.pols_const[of "R" "Vr K v" "X" "p"], assumption+,
       simp add:ale_refl)
 apply (subgoal_tac "p = 𝟬R", simp)
 apply (thin_tac "p  𝟬R")
 apply (rule contrapos_pp, simp+)

apply (frule n_val_valuation[of v])
apply (frule val_nonzero_z[of "n_val K v" "p"])
 apply (simp add:Vr_mem_f_mem)
 apply (frule PolynRg.subring[of "R" "Vr K v" "X"])
 apply (simp only:Ring.Subring_zero_ring_zero[THEN sym, of "R" "Vr K v"])
 apply (simp add:Vr_0_f_0, erule exE)
 apply (frule val_pos_mem_Vr[THEN sym, of "v" "p"])
 apply (simp add:Vr_mem_f_mem, simp)
 apply (frule val_pos_n_val_pos[of "v" "p"])
 apply (simp add:Vr_mem_f_mem, simp)
 apply (simp add:ant_0[THEN sym])
apply (frule_tac z = z in zpos_nat, erule exE)
apply (unfold pol_limit_def, erule conjE)
 apply (rotate_tac -1, drule_tac x = "Suc n" in spec)
 apply (subgoal_tac "¬ (M. m. M < m 
             P_mod R (Vr K v) X (vp K v (Vr K v) (an (Suc n))) ( F m ±R -aR p))")
 apply blast
 apply (thin_tac "M. m. M < m 
           P_mod R (Vr K v) X (vp K v (Vr K v) (an (Suc n))) (F m ±R -aR p)")
 apply simp
 apply (subgoal_tac "M < (Suc M) 
       ¬ P_mod R (Vr K v) X (vp K v (Vr K v) (an (Suc n))) (𝟬R ±R -aR p)")
 apply blast
 apply simp
 apply (frule Ring.ring_is_ag[of "R"])
 apply (frule aGroup.ag_mOp_closed[of "R" "p"], assumption) 
 apply (simp add:aGroup.ag_l_zero)
 apply (frule Ring.ring_is_ag[of "Vr K v"])
 apply (frule aGroup.ag_mOp_closed[of "Vr K v" "p"], assumption) 
 apply (frule_tac n = "an (Suc n)" in vp_apow_ideal[of v], simp)
 apply (frule PolynRg.subring[of "R" "Vr K v" "X"])
 apply (simp add:Ring.Subring_minus_ring_minus[THEN sym, of "R" "Vr K v"])
 apply (simp add:PolynRg.P_mod_coeffTr[of "R" "Vr K v" "X" _ "-a(Vr K v) p"])
 apply (rule contrapos_pp, simp+)

 apply (frule_tac I = "vp K v (Vr K v) (an (Suc n))" in 
        Ring.ideal_inv1_closed[of "Vr K v" _ "-a(Vr K v) p"], assumption+)
 apply (simp add:aGroup.ag_inv_inv)
 apply (frule_tac n = "an (Suc n)" in n_value_x_1[of "v" _ "p"], simp)   
 apply assumption
 apply simp
 apply (simp add:ant_int, simp add:ale_natle)

apply (fold pol_limit_def) 
apply (case_tac "ad = ", simp)
apply simp apply (erule exE)
apply (subgoal_tac "0  ad")
apply (frule Plimit_deg[of "v" "R" "X" "F" "na ad" "p"], assumption+)
 apply (simp add:an_na)+
apply (drule_tac x = n in spec,
       drule_tac x = n in spec)

apply (frule_tac p = "F n" in PolynRg.nonzero_deg_pos[of "R" "Vr K v" "X"],
           assumption+)
apply (rule_tac j = "deg R (Vr K v) X (F n)" in ale_trans[of "0" _ "ad"],
           assumption+)
done

lemma (in Corps) Plimit_ldeg:"valuation K v; PolynRg R (Vr K v) X;
     n. F n  carrier R; p  carrier R; 
     n. deg R (Vr K v) X (F n)  an (Suc d); 
      Plimit R X K v F p    Plimit R X K v (Pseql R X K v d F) 
                                             (ldeg_p R (Vr K v) X d p)"
apply (frule Vr_ring[of v], frule PolynRg.is_Ring,
       frule Ring.ring_is_ag[of "R"])
apply (frule Plimit_deg[of v R X F "Suc d" p], assumption+)
apply (simp add:Pseql_def, simp add:pol_limit_def)
apply (rule conjI, rule allI)
 apply (rule PolynRg.ldeg_p_mem, assumption+, simp+)
 apply (rule allI)
 apply (rotate_tac -5, drule_tac x = N in spec, erule exE)
 apply (subgoal_tac "m > M. P_mod R (Vr K v) X (vp K v (Vr K v) (an N))
              (ldeg_p R (Vr K v) X d (F m) ±R -aR (ldeg_p R (Vr K v) X d p))",
        blast)
 apply (rule allI, rule impI)
 apply (rotate_tac -2, 
        frule_tac x = m in spec,
        thin_tac "m. M < m 
            P_mod R (Vr K v) X (vp K v (Vr K v) (an N)) ( F m ±R -aR p)",
        simp)
 apply (subst v_ldeg_p_mOp[of v R X _ d], assumption+)
 apply (subst v_ldeg_p_pOp[of v R X _ "-aR p"], assumption+)
 apply (simp, rule aGroup.ag_mOp_closed, assumption, simp, simp)
 apply (frule PolynRg.deg_minus_eq1 [THEN sym, of "R" "Vr K v" "X" "p"], 
        assumption+)
 apply simp 
apply (rule_tac p = "F m ±R -aR p" and N = N in PCauchy_lTr[of  "v"  
       "R" "X" _ "d" ], assumption+)
 apply (rule_tac x = "F m" in aGroup.ag_pOp_closed[of "R" _ "-aR p"], 
       assumption+)
 apply (simp, rule aGroup.ag_mOp_closed, assumption+)
apply (frule PolynRg.deg_minus_eq1 [of "R" "Vr K v" "X" "p"], assumption+)
apply (rule PolynRg.polyn_deg_add4[of "R" "Vr K v" "X" _ "-aR p" "Suc d"],
         assumption+)
  apply (simp, rule aGroup.ag_mOp_closed, assumption, simp+)
done

lemma (in Corps) Plimit_hdeg:"valuation K v; PolynRg R (Vr K v) X;
     n. F n  carrier R; n. deg R (Vr K v) X (F n)  an (Suc d); 
      p  carrier R; Plimit R X K v  F p    
      Plimit R X K v  (Pseqh R X K v d F) (hdeg_p R (Vr K v) X (Suc d) p)"
apply (frule Vr_ring[of "v"], frule PolynRg.is_Ring,
       frule Ring.ring_is_ag[of "R"])
apply (frule Plimit_deg[of v R X F "Suc d" p], assumption+)
apply (simp add:Pseqh_def, simp add:pol_limit_def)
apply (rule conjI, rule allI)
 apply (rule PolynRg.hdeg_p_mem, assumption+, simp+)
 apply (rule allI)
 apply (rotate_tac -5, drule_tac x = N in spec)
 apply (erule exE) 
 apply (subgoal_tac "m>M. P_mod R (Vr K v) X (vp K v (Vr K v) (an N))
  (hdeg_p R (Vr K v) X (Suc d) (F m) ±R -aR (hdeg_p R (Vr K v) X (Suc d) p))",
    blast)
 apply (rule allI, rule impI)
 apply (rotate_tac -2, 
        drule_tac x = m in spec, simp)
 apply (subst v_hdeg_p_mOp[of v R X _ d], assumption+)
 apply (subst v_hdeg_p_pOp[of v R X _ "-aR p"], assumption+)
 apply (simp, rule aGroup.ag_mOp_closed, assumption, simp, simp)
 apply (frule PolynRg.deg_minus_eq1 [THEN sym, of R "Vr K v" X p], assumption+)
 apply simp 
apply (rule_tac p = "F m ±R -aR p" and N = N in PCauchy_hTr[of v R X _ d ], 
       assumption+)
 apply (rule_tac x = "F m" in aGroup.ag_pOp_closed[of R _ "-aR p"], 
        assumption+)
 apply (simp, rule aGroup.ag_mOp_closed, assumption+)
apply (frule PolynRg.deg_minus_eq1 [of "R" "Vr K v" "X" "p"], assumption+)
apply (rule PolynRg.polyn_deg_add4[of "R" "Vr K v" "X" _ "-aR p" "Suc d"],
         assumption+)
  apply (simp, rule aGroup.ag_mOp_closed, assumption, simp+)
done 

lemma (in Corps) P_limit_uniqueTr:"valuation K v; PolynRg R (Vr K v) X  
 F. ((n. F n  carrier R)  (n. deg R (Vr K v) X (F n)  (an d)) 
      (p1 p2. p1  carrier R  p2  carrier R  Plimit R X K v F p1  
           Plimit R X K v F p2  p1 = p2))"
apply (frule PolynRg.is_Ring)
apply (induct_tac d)
apply (rule allI, rule impI, (rule allI)+, rule impI)
apply (erule conjE)+
apply (subgoal_tac "n. F n  carrier (Vr K v)")
apply (frule Vr_ring[of "v"])
apply (frule PolynRg.X_mem_R[of "R" "Vr K v" "X"])
apply (frule_tac f = F and F = F and d = 0 and b = p1 and c = p2 in 
        mono_P_limt_unique[of v R X], assumption+)
apply (rule allI, drule_tac x = n in spec, 
       simp add:Ring.ring_r_one)
apply (frule_tac F = F and p = p1 in Plimit_deg[of v R X _ 0],
       assumption+, simp add:deg_0_const,
       frule_tac F = F and p = p2 in Plimit_deg[of v R X _ 0],
       assumption+, simp add:deg_0_const)
apply (simp add:Ring.ring_r_one)+ 
apply (simp add:deg_0_const)

(******** case Suc d **********)
apply (rename_tac d)
apply (rule allI, rule impI)
apply (erule conjE)
apply ((rule allI)+, rule impI, (erule conjE)+) 
apply (frule_tac F = F and p = p1 and d = d in Plimit_ldeg[of v R X],  
                 assumption+,
       frule_tac F = F and p = p2 and d = d in Plimit_ldeg[of v R X],  
                 assumption+,
       frule_tac F = F and p = p1 and d = d in Plimit_hdeg[of v R X],  
                 assumption+,
       frule_tac F = F and p = p2 and d = d in Plimit_hdeg[of v R X],  
                 assumption+)
apply (frule_tac a = "Pseql R X K v d F" in forall_spec) 
 apply (rule conjI)
 apply (rule allI)
 apply (rule Pseql_mem, assumption+, simp)
 apply (rule allI, simp)
 apply (rule allI)
apply (subst Pseql_def)
 apply (rule_tac p = "F n" and d = d in PolynRg.deg_ldeg_p[of R "Vr K v" X],
                      assumption+) apply (simp add:Vr_ring)
 apply simp 
 apply (thin_tac "F. (n. F n  carrier R)  
       (n. deg R (Vr K v) X (F n)  an d) 
         (p1 p2. 
                p1  carrier R 
                p2  carrier R 
                Plimit R X K v F p1  Plimit R X K v F p2 
                p1 = p2)")
apply (frule Vr_ring[of v])
apply (frule_tac F = F and d = "Suc d" and p = p1 in 
                           Plimit_deg[of v R X], assumption+,
       frule_tac F = F and d = "Suc d" and p = p2 in 
                           Plimit_deg[of v R X], assumption+)
apply (subgoal_tac "(ldeg_p R (Vr K v) X d p1) = (ldeg_p R (Vr K v) X d p2)")
apply (subgoal_tac "hdeg_p R (Vr K v) X (Suc d) p1 = 
                                        hdeg_p R (Vr K v) X (Suc d) p2")

apply (frule_tac p = p1 and d = d in PolynRg.decompos_p[of "R" "Vr K v" "X"],
                        assumption+,
       frule_tac p = p2 and d = d in PolynRg.decompos_p[of "R" "Vr K v" "X"],
                        assumption+)
 apply simp
 apply (thin_tac "Plimit R X K v Pseql R X K v d F (ldeg_p R (Vr K v) X d p1)",
        thin_tac "Plimit R X K v Pseql R X K v d F (ldeg_p R (Vr K v) X d p2)",
        thin_tac "p1 p2. p1  carrier R  p2  carrier R  
           Plimit R X K v Pseql R X K v d F p1 
           Plimit R X K v Pseql R X K v d F p2  p1 = p2")
 apply (simp only:hdeg_p_def)
 apply (rule_tac f = "λj. snd (scf_d R (Vr K v) X (F j) (Suc d)) (Suc d)" 
    and F = "Pseqh R X K v d F" 
    and b = "(snd (scf_d R (Vr K v) X p1 (Suc d))) (Suc d)"
    and d = "Suc d" and c = "snd (scf_d R (Vr K v) X p2 (Suc d)) (Suc d)" in 
        mono_P_limt_unique[of v R X], assumption+)
 apply (rule allI) 
apply (frule_tac p = "F n" and d = "Suc d" in 
                 PolynRg.scf_d_pol[of "R" "Vr K v" "X"])
 apply (simp del:npow_suc)+
 apply (frule_tac c = "scf_d R (Vr K v) X (F n) (Suc d)" and
        j = "Suc d" in PolynRg.pol_coeff_mem[of R "Vr K v" X])
 apply simp apply (simp del:npow_suc)+
 apply (rule allI)
apply (frule_tac c = "scf_d R (Vr K v) X (F n) (Suc d)" and
        j = "Suc d" in PolynRg.pol_coeff_mem[of R "Vr K v" X])
 apply (frule_tac p = "F n" and d = "Suc d" in PolynRg.scf_d_pol[of R 
           "Vr K v" X], (simp del:npow_suc)+)
 apply (cut_tac p = "F n" and d = "Suc d" in PolynRg.scf_d_pol[of R 
           "Vr K v" X], (simp del:npow_suc)+)
          
 apply (subst Pseqh_def) apply (simp only:hdeg_p_def)
apply (frule_tac p = p1 and d = "Suc d" in PolynRg.scf_d_pol[of R "Vr K v" X],
       assumption+)
 apply (rule_tac c = "scf_d R (Vr K v) X p1 (Suc d)" and
        j = "Suc d" in PolynRg.pol_coeff_mem[of R "Vr K v" X], assumption+,
   simp, simp)
apply (frule_tac p = p2 and d = "Suc d" in PolynRg.scf_d_pol[of R "Vr K v" X],
       assumption+)
 apply (rule_tac c = "scf_d R (Vr K v) X p2 (Suc d)" and
        j = "Suc d" in PolynRg.pol_coeff_mem[of R "Vr K v" X], assumption+,
   simp, simp) apply simp apply simp 
 apply (rotate_tac -4,
        drule_tac x = "ldeg_p R (Vr K v) X d p1" in spec,
        rotate_tac -1,
        drule_tac x = "ldeg_p R (Vr K v) X d p2" in spec) 
 apply (simp add:PolynRg.ldeg_p_mem)
done

lemma (in Corps) P_limit_unique:"valuation K v; Completev K;
  PolynRg R (Vr K v) X; n. F n  carrier R; 
  n. deg R (Vr K v) X (F n)  (an d); p1  carrier R; p2  carrier R; 
  Plimit R X K v F p1; Plimit R X K v F p2   p1 = p2"
apply (frule P_limit_uniqueTr[of "v" "R" "X" "d"], assumption+)
apply blast
done 

lemma (in Corps) P_limitTr:"valuation K v; Completev K; PolynRg R (Vr K v) X
  F. ((n. F n  carrier R)  (n. deg R (Vr K v) X (F n)  (an d)) 
        (N. M. n m. M < n  M < m  
        P_mod R (Vr K v) X (vp K v (Vr K v) (an N)) (F n ±R -aR (F m))) 
        (pcarrier R. Plimit R X K v F p))"
apply (frule PolynRg.is_Ring)
apply (frule Vr_ring[of v])
 apply (induct_tac d)

 apply simp
 apply (rule allI, rule impI, (erule conjE)+)
 apply (frule_tac F = F and f = F in monomial_P_limt[of v R X  _ _ 0], 
        assumption+)
 apply (rule allI)
 apply (rotate_tac 5, drule_tac x = n in spec) 
 apply (simp add:deg_0_const)
 apply (rule allI)
  apply (drule_tac x = n in spec,
         thin_tac "n. deg R (Vr K v) X (F n)  0")
  apply (frule PolynRg.X_mem_R[of "R" "Vr K v" "X"],
         frule PolynRg.is_Ring,
         simp add:Ring.ring_r_one, assumption)

 apply (erule bexE)
 apply (frule PolynRg.subring[of "R" "Vr K v" "X"]) 
 apply (cut_tac x = b in Ring.mem_subring_mem_ring[of "R" "Vr K v"])
  apply (frule PolynRg.X_mem_R[of "R" "Vr K v" "X"], assumption+)
  apply (simp add:Ring.ring_r_one, blast)

(*********** case n ***************)
apply (rule allI, rule impI) apply (rename_tac d F)
apply (erule conjE)+
 apply (subgoal_tac "(n.(Pseql R X K v d F) n  carrier R) 
    (n. deg R (Vr K v) X ((Pseql R X K v d F) n)  an d) 
    (N. M. n m. M < n  M < m 
     P_mod R (Vr K v) X (vp K v (Vr K v) (an N))
        ((Pseql R X K v d F) n ±R -aR ((Pseql R X K v d F) m)))")
 apply (frule_tac a = "Pseql R X K v d F" in forall_spec, assumption)
 apply (erule bexE)
 apply (thin_tac "F. (n. F n  carrier R) 
     (n. deg R (Vr K v) X (F n)  an d) 
     (N. M. n m. M < n  M < m 
        P_mod R (Vr K v) X (vp K v (Vr K v) (an N)) (F n ±R -aR (F m))) 
        (pcarrier R. Plimit R X K v F p)",
     thin_tac "(n. (Pseql R X K v d F) n  carrier R) 
     (n. deg R (Vr K v) X ((Pseql R X K v d F) n)  an d) 
    (N. M. n m. M < n  M < m  P_mod R (Vr K v) X (vp K v (Vr K v) (an N))
    ((Pseql R X K v d F) n ±R -aR ((Pseql R X K v d F) m)))")
 apply (subgoal_tac "N. M. n m. M < n  M < m 
                      P_mod R (Vr K v) X (vp K v (Vr K v) (an N))
                       ((PseqhR X K v d F) n ±R -aR ((PseqhR X K v d F) m))")
 apply (frule_tac f = "λj. snd (scf_d R (Vr K v) X (F j) (Suc d)) (Suc d)" 
  and  F = "Pseqh R X K v d F" and d = "Suc d" in monomial_P_limt[of v R X], 
       assumption+)
 apply (rule allI)
 apply (drule_tac x = n in spec,
        drule_tac x = n in spec,
        frule_tac p = "F n" and d = "Suc d" in PolynRg.scf_d_pol[of R "Vr K v" 
       "X"], assumption+, (erule conjE)+)
 apply (rule_tac c = "scf_d R (Vr K v) X (F n) (Suc d)" and j = "Suc d" in 
        PolynRg.pol_coeff_mem[of R "Vr K v" X], assumption+) 
 apply simp
 apply (rule allI)
  apply (thin_tac "N. M. n m. M < n  M < m 
         P_mod R (Vr K v) X (vp K v (Vr K v) (an N))
                       ( (Pseqh R X K v d F) n ±R -aR ((Pseqh R X K v d F) m))")
  apply (simp only:Pseqh_def hdeg_p_def, assumption, erule bexE)

apply (thin_tac "N. M. n m. M < n  M < m 
       P_mod R (Vr K v) X (vp K v (Vr K v) (an N)) (F n ±R -aR (F m))",
       thin_tac "N. M. n m. M < n  M < m 
               P_mod R (Vr K v) X (vp K v (Vr K v) (an N))
               ((Pseqh R X K v d F) n ±R -aR ((Pseqh R X K v d F) m))")

apply (subgoal_tac "Plimit R X K v F (p ±R b rR (X^R (Suc d)))",
       subgoal_tac "p ±R b rR(X^R (Suc d))  carrier R", blast)

apply (frule PolynRg.X_mem_R[of "R" "Vr K v" "X"],
       frule_tac n = "Suc d" in Ring.npClose[of "R" "X"], assumption+,
       frule Ring.ring_is_ag[of "R"],
       rule aGroup.ag_pOp_closed[of "R"], assumption+,
       rule Ring.ring_tOp_closed, assumption+)
 apply (frule PolynRg.subring[of "R" "Vr K v" "X"],
        simp add:Ring.mem_subring_mem_ring, assumption) 

apply (simp del:npow_suc add:pol_limit_def,
       rule allI,
       subgoal_tac "n. F n = (Pseql R X K v d F) n ±R ((Pseqh R X K v d F) n)",
       simp del:npow_suc,
       subgoal_tac "m. (Pseql R X K v d F) m ±R ((Pseqh R X K v d F) m) ±R
        -aR (p ±R (b rR (X^R (Suc d)))) = (Pseql R X K v d F) m ±R -aR p ±R 
         ((Pseqh R X K v d F) m ±R -aR (b rR (X^R (Suc d))))",
       simp del:npow_suc)
 
apply (thin_tac "m. (PseqlR  X K v d F) m ±R (Pseqh R X K v d F) m ±R
    -aR (p ±R b rR X^R (Suc d)) = (PseqlR  X K v d F) m ±R -aR p ±R
     ((Pseqh R X K v d F) m ±R -aR b rR X^R (Suc d))")
apply (erule conjE)+
apply (rotate_tac -3, 
       drule_tac x = N in spec, erule exE)
apply (rotate_tac 1, 
       drule_tac x = N in spec, erule exE)
apply (rename_tac d F p b N M1 M2)
apply (subgoal_tac "m. (max M1 M2) < m 
           P_mod R (Vr K v) X (vp K v (Vr K v) (an N))
           ((Pseql R X K v d F) m ±R -aR p ±R
            ((Pseqh R X K v d F) m ±R -aR (b rR (X^R (Suc d)))))", blast)
apply (rule allI, rule impI)
apply (rotate_tac -2, 
       drule_tac x = m in spec, simp del:npow_suc)
apply (erule conjE)
apply (rotate_tac -5,
       drule_tac x = m in spec, simp del:npow_suc)
 apply (frule_tac n = "an N" in vp_apow_ideal[of v], simp del:npow_suc)
 apply (frule Ring.ring_is_ag[of "R"])
 apply (rule_tac I = "vp K v (Vr K v) (an N)" and 
        p = "(Pseql R X K v d F) m ±R -aR p" and 
        q = "(Pseqh R X K v d F) m ±R -aR (b rR (X^R (Suc d)))" in 
        PolynRg.P_mod_add[of R "Vr K v" X], assumption+)

apply (rule aGroup.ag_pOp_closed, assumption+) 
 apply (simp add:Pseql_mem, rule aGroup.ag_mOp_closed, assumption+)

 apply (rule aGroup.ag_pOp_closed[of "R"], assumption)
 apply (simp add:Pseqh_mem, rule aGroup.ag_mOp_closed, assumption)
 apply (rule Ring.ring_tOp_closed, assumption)
 apply (frule PolynRg.subring[of "R" "Vr K v" "X"])
 apply (simp add:Ring.mem_subring_mem_ring)
 apply (frule PolynRg.X_mem_R[of "R" "Vr K v" "X"])
 apply (rule Ring.npClose, assumption+)

apply (rule allI)
 apply (thin_tac "n.(Pseql R X K v d F) n ±R((Pseqh R X K v d F) n)  carrier R")
 apply (erule conjE)+
 apply (thin_tac "n. deg R (Vr K v) X
             ((PseqlR  X K v d F) n ±R (Pseqh R X K v d F) n)  an (Suc d)")
 apply (thin_tac "N. M. m>M. P_mod R (Vr K v) X (vp K v (Vr K v) (an N))
                       ((PseqlR  X K v d F) m ±R -aR p)",
        thin_tac "N. M. m>M. P_mod R (Vr K v) X (vp K v (Vr K v) (an N))
                       ((Pseqh R X K v d F) m ±R -aR b rR X^R (Suc d))",
        thin_tac "n. F n = (Pseql R X K v d F) n ±R ((Pseqh R X K v d F) n)") 
 apply (drule_tac x = m in spec,
        drule_tac x = m in spec)
 apply (subgoal_tac "b rR X^R (Suc d)  carrier R")
 apply (frule Ring.ring_is_ag[of "R"])
 apply (frule_tac x = p in aGroup.ag_mOp_closed[of "R"], assumption+)
 apply (subst aGroup.ag_pOp_assoc[of "R"], assumption+)
 apply (rule aGroup.ag_mOp_closed, assumption+)
 apply (rule aGroup.ag_pOp_closed, assumption+)
 apply (frule_tac x1 = "-aR p" and y1 = "(Pseqh R X K v d F) m" and z1 = 
  "-aR (b rR (X^R (Suc d)))" in aGroup.ag_pOp_assoc[THEN sym, of "R"], 
  assumption+)
 apply (rule aGroup.ag_mOp_closed, assumption+, simp del:npow_suc)
 apply (subst aGroup.ag_pOp_assoc[THEN sym], assumption+)
 apply (rule aGroup.ag_mOp_closed, assumption+,
        rule aGroup.ag_pOp_closed, assumption+)
 apply (subst aGroup.ag_add4_rel[of R], assumption+)
 apply (rule aGroup.ag_mOp_closed, assumption+)
 apply (subst aGroup.ag_p_inv[THEN sym, of R], assumption+, simp del:npow_suc)

 apply (rule Ring.ring_tOp_closed, assumption+,
        frule PolynRg.subring[of R "Vr K v" X],
        simp add:Ring.mem_subring_mem_ring,
        rule Ring.npClose, assumption+, simp add:PolynRg.X_mem_R)
apply (rule allI)
apply (rule_tac F = F and n = n and d = d in Pseq_decompos[of "v" "R" "X"],
       assumption+, simp, simp)
apply (rule allI)
apply (rotate_tac -3, drule_tac x = N in spec)
apply (erule exE)
 apply (subgoal_tac "n m. M < n  M < m 
                    P_mod R (Vr K v) X (vp K v (Vr K v) (an N))
                     ((Pseqh R X K v d F) n ±R -aR ((Pseqh R X K v d F) m))")
 apply blast
 apply ((rule allI)+, rule impI)
 apply (rotate_tac -2,
        drule_tac x = n in spec, 
        rotate_tac -1,
        drule_tac x = m in spec,
        simp) 
 
apply (simp only: Pseqh_def)
apply (subst v_hdeg_p_mOp[of "v" "R" "X"], assumption+)
 apply simp+

apply (frule Ring.ring_is_ag[of "R"])
apply (subst v_hdeg_p_pOp[of "v" "R" "X"], assumption+)
apply (simp, rule aGroup.ag_mOp_closed, assumption, simp, simp,
       frule_tac p1 = "F m" in PolynRg.deg_minus_eq1 [THEN sym, of R "Vr K v" 
       X])
apply simp 
apply (rotate_tac -1, frule sym, 
       thin_tac "deg R (Vr K v) X (F m) = deg R (Vr K v) X (-aR (F m))", simp)
apply (rule PCauchy_hTr[of v R X], assumption+)
apply (rule_tac x = "F n" and y = "-aR (F m)" in aGroup.ag_pOp_closed[of "R"], 
       assumption+,
       simp, rule aGroup.ag_mOp_closed, assumption+, simp)
apply (frule_tac p = "F m" in PolynRg.deg_minus_eq1 [of R "Vr K v" X],
       simp, 
       rule_tac p = "F n" and q = "-aR (F m)" and n = "Suc d" in 
       PolynRg.polyn_deg_add4[of "R" "Vr K v" "X"], assumption+,
       simp, rule aGroup.ag_mOp_closed, assumption, simp+)

apply (rule conjI, rule allI, rule Pseql_mem, assumption+, simp)
 apply (rule allI, simp) 

apply (thin_tac "F. (n. F n  carrier R) 
      (n. deg R (Vr K v) X (F n)  an d) 
       (N. M. n m. M < n  M < m 
          P_mod R (Vr K v) X (vp K v (Vr K v) (an N)) (F n ±R -aR (F m))) 
               (pcarrier R. Plimit R X K v F p)")

apply (rule conjI, rule allI)
 apply (subst Pseql_def)
 apply (rule_tac p = "F n" and d = d in PolynRg.deg_ldeg_p[of R "Vr K v" X],
        assumption+)
 apply simp+

apply (simp only: Pseql_def)
 apply (rule allI)
 apply (rotate_tac -1, drule_tac x = N in spec)
 apply (erule exE)
 apply (subgoal_tac "n m. M < n  M < m 
        P_mod R (Vr K v) X (vp K v (Vr K v) (an N)) 
          (ldeg_p R (Vr K v) X d (F n) ±R -aR (ldeg_p R (Vr K v) X d (F m)))")
 apply blast
 apply ((rule allI)+, rule impI, erule conjE)
 apply (rotate_tac -3, drule_tac x = n in spec,
        rotate_tac -1, drule_tac x = m in spec, simp) 

apply (subst v_ldeg_p_mOp[of v R X], assumption+, simp+)

apply (frule Ring.ring_is_ag[of "R"])
apply (subst v_ldeg_p_pOp[of v R X], assumption+, simp,
       rule aGroup.ag_mOp_closed, assumption, simp, simp,
       frule_tac p = "F m" in PolynRg.deg_minus_eq1[of R "Vr K v" X], simp)
apply simp 
apply (rule PCauchy_lTr[of v R X], assumption+)
apply (rule_tac x = "F n" and y = "-aR (F m)" in aGroup.ag_pOp_closed[of R], 
       assumption+,
       simp, rule aGroup.ag_mOp_closed, assumption+, simp)

apply (frule_tac p = "F m" in PolynRg.deg_minus_eq1[of R "Vr K v" X], simp,
       rule_tac p = "F n" and q = "-aR (F m)" and n = "Suc d" in 
       PolynRg.polyn_deg_add4[of "R" "Vr K v" "X"], assumption+,
       simp, rule aGroup.ag_mOp_closed, assumption, simp+)
done

lemma (in Corps) PCauchy_Plimit:"valuation K v; Completev K;
      PolynRg R (Vr K v) X; PCauchyR X K v F 
        pcarrier R. PlimitR X K v F p"
apply (simp add:pol_Cauchy_seq_def)
apply ((erule conjE)+, erule exE)
apply (frule_tac d = d in P_limitTr[of  "v" "R" "X"], assumption+)
apply (drule_tac a = F in forall_spec, simp)
apply assumption
done

lemma (in Corps) P_limit_mult:"valuation K v; PolynRg R (Vr K v) X; 
  n. F n  carrier R; n. G n  carrier R; p1  carrier R; p2  carrier R; 
  Plimit R X K v F p1; Plimit R X K v G p2   
                  Plimit R X K v (λn. (F n) rR (G n)) (p1 rR p2)"
apply (frule Vr_ring[of v],
       frule PolynRg.is_Ring,
       frule Ring.ring_is_ag[of "R"])
apply (simp add:pol_limit_def)
apply (rule conjI)
apply (rule allI)
 apply (drule_tac x = n in spec,
        drule_tac x = n in spec)

 apply (simp add:Ring.ring_tOp_closed[of "R"])

apply (rule allI)
 apply (rotate_tac 6,
        drule_tac x = N in spec,
        drule_tac x = N in spec)
 apply (erule exE, erule exE, rename_tac N M1 M2) 
 apply (subgoal_tac "m. (max M1 M2) < m 
          P_mod R (Vr K v) X (vp K v (Vr K v) (an N))
                     ((F m) rR (G m) ±R -aR (p1 rR  p2))")
 apply blast 
 
apply (rule allI, rule impI, simp, erule conjE)
 apply (rotate_tac -4, 
        drule_tac x = m in spec,
        drule_tac x = m in spec, simp)
 apply (subgoal_tac "(F m) rR (G m) ±R -aR p1 rR p2 =
             ((F m) ±R -aR p1) rR (G m) ±R  p1 rR ((G m) ±R -aR p2)", simp) 
 apply (frule_tac n = "an N" in vp_apow_ideal[of v])
 apply simp
 apply (rule_tac I = "vp K v (Vr K v) (an N)" and 
        p = "((F m) ±R -aR p1) rR (G m)" and  q = "p1 rR ((G m) ±R -aR p2)"
        in PolynRg.P_mod_add[of R "Vr K v" "X"],
         assumption+)
 apply (rule Ring.ring_tOp_closed[of "R"], assumption+)
 apply (rule aGroup.ag_pOp_closed, assumption) apply simp 
 apply (rule aGroup.ag_mOp_closed, assumption+) apply simp
 apply (rule Ring.ring_tOp_closed[of "R"], assumption+)
 apply (rule aGroup.ag_pOp_closed, assumption) apply simp
  apply (rule aGroup.ag_mOp_closed, assumption+) 
apply (frule Ring.whole_ideal[of "Vr K v"])
apply (frule_tac I = "vp K v (Vr K v) (an N)" and J = "carrier (Vr K v)" and 
   p = "F m ±R -aR p1" and q = "G m" in PolynRg.P_mod_mult1[of R "Vr K v" X],
   assumption+,
   rule aGroup.ag_pOp_closed, assumption+, simp, rule aGroup.ag_mOp_closed,
      assumption+) apply simp apply assumption
apply (rotate_tac 8,
       drule_tac x = m in spec)
apply (case_tac "G m = 𝟬R", simp add:P_mod_def)
apply (frule_tac p = "G m" in PolynRg.s_cf_expr[of R "Vr K v" X], assumption+,
       (erule conjE)+)
thm PolynRg.P_mod_mod
apply (frule_tac I1 = "carrier (Vr K v)" and p1 = "G m" and 
       c1 = "s_cf R (Vr K v) X (G m)" in PolynRg.P_mod_mod[THEN sym, 
       of R "Vr K v" X], assumption+)
apply (simp,
      thin_tac "P_mod R (Vr K v) X (carrier (Vr K v)) (G m) =
        (jfst (s_cf R (Vr K v) X (G m)).
            snd (s_cf R (Vr K v) X (G m)) j  carrier (Vr K v))")
apply (rule allI, rule impI)
 apply (simp add:PolynRg.pol_coeff_mem)
apply (simp add:Ring.idealprod_whole_r[of "Vr K v"]) 

apply (cut_tac I = "carrier (Vr K v)" and J = "vp K v (Vr K v) (an N)" and 
      p = p1 and q = "G m ±R -aR p2" in PolynRg.P_mod_mult1[of R "Vr K v" X],
      assumption+) 
apply (simp only: Ring.whole_ideal, assumption+) 
apply (rule aGroup.ag_pOp_closed, assumption+, simp, rule aGroup.ag_mOp_closed,
      assumption+)
apply (frule PolynRg.s_cf_expr0[of R "Vr K v" X p1], assumption+)
  thm PolynRg.P_mod_mod
apply (cut_tac I1 = "carrier (Vr K v)" and p1 = p1 and 
       c1 = "s_cf R (Vr K v) X p1" in PolynRg.P_mod_mod[THEN sym,
        of R "Vr K v" X], assumption+)
apply (simp add:Ring.whole_ideal, assumption+)
apply (simp, simp, simp, (erule conjE)+,
       thin_tac "P_mod R (Vr K v) X (carrier (Vr K v)) p1 =
        (jfst (s_cf R (Vr K v) X p1).
            snd (s_cf R (Vr K v) X p1) j  carrier (Vr K v))")     
 apply (rule allI, rule impI)
 apply (simp add:PolynRg.pol_coeff_mem, assumption)  
apply (simp add:Ring.idealprod_whole_l[of "Vr K v"]) 
apply (drule_tac x = m in spec,
       drule_tac x = m in spec)
apply (frule aGroup.ag_mOp_closed[of R p1], assumption,
       frule aGroup.ag_mOp_closed[of R p2], assumption )
apply (simp add:Ring.ring_distrib1 Ring.ring_distrib2)
 apply (subst aGroup.pOp_assocTr43[of R], assumption+,
        (rule Ring.ring_tOp_closed, assumption+)+)
 apply (simp add:Ring.ring_inv1_1[THEN sym],
        simp add:Ring.ring_inv1_2[THEN sym])
apply (frule_tac x = p1 and y = "G m" in Ring.ring_tOp_closed, assumption+,
       frule_tac x = "F m" and y = "G m" in Ring.ring_tOp_closed, assumption+,
       simp add:aGroup.ag_l_inv1 aGroup.ag_r_zero)
done
       (** Hfst K v R X t S Y f g h m**)
definition
  Hfst :: "[_, 'b  ant, ('b, 'm1) Ring_scheme, 'b,'b, ('b set, 'm2) Ring_scheme, 'b set, 'b, 'b, 'b, nat]  'b" 
        ("(11Hfst⇘ _ _ _ _ _ _ _ _ _ _ _)" [67,67,67,67,67,67,67,67,67,67,68]67) where
  "HfstK v R X t S Y f g h m = fst (HprR (Vr K v) X t S Y f g h m)"

definition
  Hsnd :: "[_, 'b  ant, ('b, 'm1) Ring_scheme, 'b,'b, ('b set, 'm2) Ring_scheme, 'b set, 'b, 'b, 'b, nat]  'b" 
        ("(11Hsnd⇘ _ _ _ _ _ _ _ _ _ _ _)" [67,67,67,67,67,67,67,67,67,67,68]67) where
 
  "HsndK v R X t S Y f g h m = snd (HprR (Vr K v) X t S Y f g h m)"

lemma (in Corps) Hensel_starter:"valuation K v; Completev K; 
    PolynRg R (Vr K v) X; PolynRg S ((Vr K v) /r (vp K v)) Y;
    t  carrier (Vr K v); vp K v = (Vr K v) p t;
    f  carrier R; f  𝟬R; g'  carrier S; h'  carrier S;
    0 < deg S ((Vr K v) /r (vp K v)) Y g';
    0 < deg S ((Vr K v) /r (vp K v)) Y h';
    ((erH R (Vr K v) X S ((Vr K v) /r (vp K v)) Y 
             (pj  (Vr K v) (vp K v))) f) =  g' rS h';
    rel_prime_pols S ((Vr K v) /r (vp K v)) Y g' h'  
 g h. g  𝟬R  h  𝟬R  g  carrier R  h  carrier R 
  deg R (Vr K v) X g  deg S ((Vr K v) /r ((Vr K v) p t)) Y
   (erH R (Vr K v) X S ((Vr K v) /r ((Vr K v) p t)) Y 
   (pj (Vr K v) ((Vr K v) p t)) g)  (deg R (Vr K v) X h + 
    deg S ((Vr K v) /r ((Vr K v) p t)) Y (erH R (Vr K v) X S 
     ((Vr K v) /r ((Vr K v) p t)) Y (pj (Vr K v) ((Vr K v) p t)) g) 
     deg R (Vr K v) X f)  
   (erH R (Vr K v) X S ((Vr K v) /r (vp K v)) Y 
                            (pj  (Vr K v) (vp K v))) g = g' 
    (erH R (Vr K v) X S ((Vr K v) /r (vp K v)) Y 
                            (pj  (Vr K v) (vp K v))) h = h' 
  0 < deg S ((Vr K v) /r ((Vr K v) p t)) Y
   (erH R (Vr K v) X S ((Vr K v) /r ((Vr K v) p t)) Y 
   (pj (Vr K v) ((Vr K v) p t)) g) 
  0 < deg S ((Vr K v) /r ((Vr K v) p t)) Y
    (erH R (Vr K v) X S ((Vr K v) /r ((Vr K v) p t)) Y 
   (pj (Vr K v) ((Vr K v) p t)) h) 
  rel_prime_pols S ((Vr K v) /r ((Vr K v) p t)) Y 
    (erH R (Vr K v) X S ((Vr K v) /r ((Vr K v) p t)) Y 
    (pj (Vr K v) ((Vr K v) p t)) g) 
    (erH R (Vr K v) X S ((Vr K v) /r ((Vr K v) p t)) Y 
    (pj (Vr K v) ((Vr K v) p t)) h) 
 P_mod R (Vr K v) X ((Vr K v) p t) (f ±R -aR (g rR h))" 
apply (frule Vr_ring[of v],
       frule PolynRg.subring[of R "Vr K v" X],
       frule vp_maximal [of v], frule PolynRg.is_Ring,
       frule Ring.subring_Ring[of R "Vr K v"], assumption+,
       frule Ring.residue_field_cd[of "Vr K v" "vp K v"], assumption+,
       frule Corps.field_is_ring[of "Vr K v /r vp K v"],
       frule pj_Hom[of "Vr K v" "vp K v"], frule vp_ideal[of "v"],
       simp add:Ring.maximal_ideal_ideal) 
apply (frule Corps.field_is_idom[of "(Vr K v) /r (vp K v)"],
       frule Vr_integral[of v], simp,
       frule Vr_mem_f_mem[of v t], assumption+) 
apply (frule PolynRg.erH_inv[of R "Vr K v" X "Vr K v p t" S Y "g'"],
       assumption+, simp add:Ring.maximal_ideal_ideal,
       simp add:PolynRg.is_Ring, assumption+, erule bexE, erule conjE)
apply (frule PolynRg.erH_inv[of R "Vr K v" X "Vr K v p t" S Y "h'"],
       assumption+, simp add:Ring.maximal_ideal_ideal,
       simp add:PolynRg.is_Ring, assumption+, erule bexE, erule conjE)
apply (rename_tac g0 h0) 
apply (subgoal_tac " g0  𝟬R  h0  𝟬R 
  deg R (Vr K v) X g0  
  deg S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S
      (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) g0) 
  deg R (Vr K v) X h0 + deg S (Vr K v /r (Vr K v p t)) Y
      (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) g0)  deg R (Vr K v) X f 
    0 < deg S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S
      (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) g0) 
   0 < deg S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S
       (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) h0) 
   rel_prime_pols S (Vr K v /r (Vr K v p t)) Y
      (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
             (pj (Vr K v) (Vr K v p t)) g0)
      (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
             (pj (Vr K v) (Vr K v p t)) h0) 
   P_mod R (Vr K v) X (Vr K v p t) (f ±R -aR g0 rR h0)")
 apply (thin_tac "g'  carrier S",
        thin_tac "h'  carrier S",
        thin_tac "0 < deg S (Vr K v /r (Vr K v p t)) Y g'",
        thin_tac "0 < deg S (Vr K v /r (Vr K v p t)) Y h'",
        thin_tac "erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) f = g' rS h'",
        thin_tac "rel_prime_pols S (Vr K v /r (Vr K v p t)) Y g' h'",
        thin_tac "Corps (Vr K v /r (Vr K v p t))",
        thin_tac "Ring  (Vr K v /r (Vr K v p t))",
        thin_tac "vp K v = Vr K v p t")
apply blast 
apply (rule conjI)
 apply (thin_tac "0 < deg S (Vr K v /r (Vr K v p t)) Y h'",
    thin_tac "erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) f = g' rS h'",
    thin_tac "rel_prime_pols S (Vr K v /r (Vr K v p t)) Y g' h'",
    thin_tac "erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) h0 = h'",
   thin_tac "deg R (Vr K v) X h0  deg S (Vr K v /r (Vr K v p t)) Y h'")
 apply (rule contrapos_pp, simp+)
 apply (simp add:PolynRg.erH_rHom_0[of R "Vr K v" X S 
      "Vr K v /r (Vr K v p t)" Y "pj (Vr K v) (Vr K v p t)"])
 apply (rotate_tac -3, drule sym, simp add:deg_def)
  apply (drule aless_imp_le[of "0" "-"],
        cut_tac minf_le_any[of "0"],
        frule ale_antisym[of "0" "-"], simp only:ant_0[THEN sym], simp)

apply (rule conjI)
 apply (thin_tac "0 < deg S (Vr K v /r (Vr K v p t)) Y g'",
    thin_tac "erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) f = g' rS h'",
    thin_tac "rel_prime_pols S (Vr K v /r (Vr K v p t)) Y g' h'",
    thin_tac "erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) g0 = g'",
   thin_tac "deg R (Vr K v) X h0  deg S (Vr K v /r (Vr K v p t)) Y h'")
 apply (rule contrapos_pp, simp+, 
        simp add:PolynRg.erH_rHom_0[of R "Vr K v" X S 
      "Vr K v /r (Vr K v p t)" Y "pj (Vr K v) (Vr K v p t)"])
 apply (rotate_tac -2, drule sym, simp add:deg_def)
 apply (frule aless_imp_le[of "0" "-"], thin_tac "0 < - ",
        cut_tac minf_le_any[of "0"],
        frule ale_antisym[of "0" "-"], simp only:ant_0[THEN sym], simp)     

apply (frule_tac x = "deg R (Vr K v) X h0" and 
       y = "deg S (Vr K v /r (Vr K v p t)) Y h'" and 
       z = "deg S (Vr K v /r (Vr K v p t)) Y g'" in aadd_le_mono)
apply (simp add:PolynRg.deg_mult_pols1[THEN sym, of S 
 "Vr K v /r (Vr K v p t)" Y "h'" "g'"]) 
 apply (frule PolynRg.is_Ring[of S "Vr K v /r (Vr K v p t)" Y],
        simp add:Ring.ring_tOp_commute[of S "h'" "g'"])
 apply (rotate_tac 11, drule sym)
 apply simp
apply (frule PolynRg.erH_rHom[of R "Vr K v" X S 
      "(Vr K v) /r (Vr K v p t)" Y "pj (Vr K v) (Vr K v p t)"], 
      assumption+)
apply (frule PolynRg.pHom_dec_deg[of R "Vr K v" X S "(Vr K v) /r (Vr K v p t)" Y "erH R (Vr K v) X S ((Vr K v) /r (Vr K v p t))
 Y (pj (Vr K v) (Vr K v p t))" "f"], assumption+) 
apply (frule_tac i = "deg R (Vr K v) X h0 +
        deg S (Vr K v /r (Vr K v p t)) Y g'" in ale_trans[of _ 
        "deg S (Vr K v /r (Vr K v p t)) Y
           (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
             (pj (Vr K v) (Vr K v p t)) f)" "deg R (Vr K v) X f"],
       assumption+) apply simp 
apply (thin_tac "deg R (Vr K v) X h0 +
        deg S (Vr K v /r (Vr K v p t)) Y g'   deg R (Vr K v) X f",
       thin_tac "deg S (Vr K v /r (Vr K v p t)) Y
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
           (pj (Vr K v) (Vr K v p t)) f)   deg R (Vr K v) X f",
       thin_tac "0 < deg S (Vr K v /r (Vr K v p t)) Y g'",
       thin_tac "0 < deg S (Vr K v /r (Vr K v p t)) Y h'",
      thin_tac "deg R (Vr K v) X h0 + deg S (Vr K v /r (Vr K v p t)) Y g'
        deg S (Vr K v /r (Vr K v p t)) Y
           (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
             (pj (Vr K v) (Vr K v p t)) f)",
     thin_tac "rel_prime_pols S (Vr K v /r (Vr K v p t)) Y g' h'")
 apply (rotate_tac 12, drule sym)
 apply (drule sym) 
 apply simp
apply (frule_tac x = g0 and y = h0 in Ring.ring_tOp_closed[of "R"], 
       assumption+)
 apply (thin_tac "deg R (Vr K v) X h0  deg S (Vr K v /r (Vr K v p t)) Y
  (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
             (pj (Vr K v) (Vr K v p t)) h0)",
       thin_tac "h' = erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) h0",
       thin_tac "g' = erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) g0",
       thin_tac "deg R (Vr K v) X g0  deg S (Vr K v /r (Vr K v p t)) Y
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
             (pj (Vr K v) (Vr K v p t)) g0)")
apply (subst PolynRg.P_mod_diff[THEN sym, of R "Vr K v" X "Vr K v p t" 
       S Y f], assumption+) apply (simp add:Ring.maximal_ideal_ideal, assumption+)
apply (rotate_tac 12, drule sym)
apply (subst PolynRg.erH_mult[of R "Vr K v" X S "Vr K v /r (Vr K v p t)"
        Y], assumption+)
done

lemma aadd_plus_le_plus:" a  (a'::ant); b  b'  a + b  a' + b'"
apply (frule aadd_le_mono[of "a" "a'" "b"])
apply (frule aadd_le_mono[of "b" "b'" "a'"])
apply (simp add:aadd_commute[of _ "a'"])
done

lemma (in Corps) Hfst_PCauchy:"valuation K v; Completev K; 
  PolynRg R (Vr K v) X; PolynRg S (Vr K v /r (Vr K v p t)) Y; g0  carrier R;
  h0  carrier R; f  carrier R; f  𝟬R; g0  𝟬R; h0  𝟬R; 
  t  carrier (Vr K v);  vp K v = Vr K v p t; 
  deg R (Vr K v) X g0  deg S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S
       (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) g0);
  deg R (Vr K v) X h0 + deg S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S
       (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) g0)
         deg R (Vr K v) X f;
  0 < deg S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S 
       (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) g0);
  0 < deg S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S 
       (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) h0);
  rel_prime_pols S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S 
         (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) g0)
    (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y 
                                    (pj (Vr K v) (Vr K v p t)) h0);

   erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
      (pj (Vr K v) (Vr K v p t)) f =
        erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
                        (pj (Vr K v) (Vr K v p t)) g0 rS
        erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
                               (pj (Vr K v) (Vr K v p t)) h0 
      PCauchy R X K v Hfst K v R X t S Y f g0 h0" 
(*  P_mod begin*)
apply(frule Vr_integral[of v], frule vp_ideal[of v],
       frule Vr_ring, frule pj_Hom[of "Vr K v" "vp K v"], assumption+,
       simp add:PolynRg.erH_mult[THEN sym, of R "Vr K v" X S 
          "Vr K v /r (Vr K v p t)" Y "pj (Vr K v) (Vr K v p t)" g0 h0],
       frule PolynRg.P_mod_diff[THEN sym, of R "Vr K v" X "Vr K v p t" S Y
        f "g0 rR h0"], assumption+, 
       frule PolynRg.is_Ring[of R], rule Ring.ring_tOp_closed,
       assumption+) (** P_mod done **) 
apply (simp add:pol_Cauchy_seq_def, rule conjI)
 apply (rule allI)

apply (frule_tac t = t and g = g0 and h = h0 and m = n in 
       PolynRg.P_mod_diffxxx5_2[of R "Vr K v" X _ S Y f],
       rule Vr_integral[of v], assumption+, simp add:vp_gen_nonzero,
       drule sym, simp add:vp_maximal, assumption+)

apply (subst Hfst_def)
apply (rule cart_prod_fst, assumption)
apply (rule conjI)
apply (subgoal_tac "n. deg R (Vr K v) X (Hfst K v R X t S Y f g0 h0 n)  
                     an (deg_n R (Vr K v) X f)")
apply blast
apply (rule allI)
apply (frule Vr_integral[of v],
       frule_tac t = t and g = g0 and h = h0 and m = n in 
       PolynRg.P_mod_diffxxx5_4[of R "Vr K v" X _ S Y f], assumption+,
       simp add:vp_gen_nonzero,
       drule sym, simp add:vp_maximal, assumption+)
apply (subst PolynRg.deg_an[THEN sym], (erule conjE)+, assumption+)
apply (simp add:Hfst_def, (erule conjE)+)
apply (frule_tac i = "deg R (Vr K v) X (fst (Hpr R (Vr K v) X t S Y f g0 h0 n))" and
      j = "deg R (Vr K v) X g0" and k = "deg S (Vr K v /r (Vr K v p t)) Y
            (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
              (pj (Vr K v) (Vr K v p t)) g0)" in ale_trans, assumption+,
       frule PolynRg.nonzero_deg_pos[of R "Vr K v" X h0], assumption+,
       frule_tac x = 0 and y = "deg R (Vr K v) X h0" and z = "deg S 
  (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
      (pj (Vr K v) (Vr K v p t)) g0)" in aadd_le_mono, simp add:aadd_0_l) 
apply (rule allI)
apply (subgoal_tac "n m. N < n  N < m 
  P_mod R (Vr K v) X (Vr K v p t (Vr K v) (an N))
     ( Hfst K v R X t S Y f g0 h0 n ±R -aR (Hfst K v R X t S Y f g0 h0 m))")
apply blast
apply ((rule allI)+, rule impI, (erule conjE)+,
       frule Vr_integral[of v], frule vp_gen_nonzero[of v t], assumption+,
       frule vp_maximal[of v])
apply (frule_tac t = t and g = g0 and h = h0 and m = n in 
      PolynRg.P_mod_diffxxx5_2[of R "Vr K v" X _ S Y f], assumption+, simp,
      assumption+,
      frule_tac t = t and g = g0 and h = h0 and m = m in 
       PolynRg.P_mod_diffxxx5_2[of R "Vr K v" X _ S Y f], assumption+, simp,
       assumption+,
      frule_tac t = t and g = g0 and h = h0 and m = N in 
       PolynRg.P_mod_diffxxx5_2[of R "Vr K v" X _ S Y f], assumption+, simp,
       assumption+, 
      frule_tac x = "Hpr R (Vr K v) X t S Y f g0 h0 m" in cart_prod_fst[of _ 
       "carrier R" "carrier R"],
       frule_tac x = "Hpr R (Vr K v) X t S Y f g0 h0 N" in cart_prod_fst[of _ 
       "carrier R" "carrier R"],
      frule_tac x = "Hpr R (Vr K v) X t S Y f g0 h0 n" in cart_prod_fst[of _ 
       "carrier R" "carrier R"],
       thin_tac "Hpr R (Vr K v) X t S Y f g0 h0 n  carrier R × carrier R",
       thin_tac "Hpr R (Vr K v) X t S Y f g0 h0 m  carrier R × carrier R")
apply (frule PolynRg.is_Ring)
apply (case_tac "N = 0", simp add:r_apow_def)
apply (rule_tac p = "Hfst K v R X t S Y f g0 h0 n ±R
               -aR (Hfst K v R X t S Y f g0 h0 m)" in 
       PolynRg.P_mod_whole[of "R" "Vr K v" "X"], assumption+,
       frule Ring.ring_is_ag[of "R"], simp add:Hfst_def,
       rule aGroup.ag_pOp_closed, assumption+, rule aGroup.ag_mOp_closed, 
       assumption+)

apply (frule_tac t = t and g = g0 and h = h0 and m = N and n = "n - N" in 
       PolynRg.P_mod_diffxxx5_3[of R "Vr K v" X _ S Y f], assumption+,
       simp+, (erule conjE)+,
       frule_tac t = t and g = g0 and h = h0 and m = N and n = "m - N" in 
       PolynRg.P_mod_diffxxx5_3[of R "Vr K v" X _ S Y f], assumption+,
       simp, (erule conjE)+,
       thin_tac "P_mod R (Vr K v) X (Vr K v p (t^(Vr K v) N)) (snd 
     (Hpr R (Vr K v) X t S Y f g0 h0 N) ±R -aR (snd (Hpr R (Vr K v) X t S Y f g0 h0 n)))",
      thin_tac "P_mod R (Vr K v) X (Vr K v p (t^(Vr K v) N)) (snd
    (Hpr R (Vr K v) X t S Y f g0 h0 N) ±R -aR (snd (Hpr R (Vr K v) X t S Y f g0 h0 m)))")
apply (frule Vr_ring[of v],
       simp only:Ring.principal_ideal_n_pow1[THEN sym],
       drule sym, simp, frule vp_ideal[of v],
       simp add:Ring.ring_pow_apow,
       frule_tac n = "an N" in vp_apow_ideal[of v], simp,
       frule Ring.ring_is_ag[of R],
       frule_tac x = "fst (Hpr R (Vr K v) X t S Y f g0 h0 n)" in 
        aGroup.ag_mOp_closed[of R], assumption)
apply (frule_tac I = "vp K v (Vr K v) (an N)" and 
      p = "(fst (Hpr R (Vr K v) X t S Y f g0 h0 N)) ±R
      -aR (fst (Hpr R (Vr K v) X t S Y f g0 h0 n))" in PolynRg.P_mod_minus[of R 
     "Vr K v" X], assumption+)

apply (rule aGroup.ag_pOp_closed, assumption+,
       simp add:aGroup.ag_p_inv aGroup.ag_inv_inv) 
 apply (frule Ring.ring_is_ag,
       frule_tac x = "-aR fst (Hpr R (Vr K v) X t S Y f g0 h0 N)" and 
       y = "fst (Hpr R (Vr K v) X t S Y f g0 h0 n)" in aGroup.ag_pOp_commute) 
 apply(rule aGroup.ag_mOp_closed, assumption+, simp,
       thin_tac "-aR fst (Hpr R (Vr K v) X t S Y f g0 h0 N) ±R
       fst (Hpr R (Vr K v) X t S Y f g0 h0 n) = fst (Hpr R (Vr K v) X t S Y f g0 h0 n) ±R
       -aR fst (Hpr R (Vr K v) X t S Y f g0 h0 N)")
apply (frule_tac I = "vp K v (Vr K v) (an N)" and 
       p = "fst (Hpr R (Vr K v) X t S Y f g0 h0 n) ±R
          -aR fst (Hpr R (Vr K v) X t S Y f g0 h0 N)" and 
       q = "fst (Hpr R (Vr K v) X t S Y f g0 h0 N) ±R
          -aR fst (Hpr R (Vr K v) X t S Y f g0 h0 m)" in PolynRg.P_mod_add[of 
          R "Vr K v" X], assumption+)
apply (rule aGroup.ag_pOp_closed, assumption+,
       rule aGroup.ag_mOp_closed, assumption+)
apply (rule aGroup.ag_pOp_closed, assumption+,
       rule aGroup.ag_mOp_closed, assumption+)
apply (frule_tac x = "fst (Hpr R (Vr K v) X t S Y f g0 h0 N)" in 
       aGroup.ag_mOp_closed, assumption+,
       frule_tac x = "fst (Hpr R (Vr K v) X t S Y f g0 h0 m)" in
       aGroup.ag_mOp_closed, assumption+,
       simp add:aGroup.pOp_assocTr43[of R] aGroup.ag_l_inv1 aGroup.ag_r_zero)
apply (simp add:Hfst_def)
done

lemma (in Corps) Hsnd_PCauchy:"valuation K v; Completev K; 
  PolynRg R (Vr K v) X; PolynRg S (Vr K v /r (Vr K v p t)) Y; g0  carrier R;
  h0  carrier R; f  carrier R; f  𝟬R; g0  𝟬R; h0  𝟬R; 
  t  carrier (Vr K v);  vp K v = Vr K v p t; 
  deg R (Vr K v) X g0  deg S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S
       (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) g0);
  deg R (Vr K v) X h0 + deg S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S
       (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) g0)
         deg R (Vr K v) X f;
  0 < deg S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S 
       (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) g0);
  0 < deg S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S 
       (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) h0);
  rel_prime_pols S (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S 
         (Vr K v /r (Vr K v p t)) Y (pj (Vr K v) (Vr K v p t)) g0)
    (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y 
                                    (pj (Vr K v) (Vr K v p t)) h0);
   erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
      (pj (Vr K v) (Vr K v p t)) f =
        erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
                        (pj (Vr K v) (Vr K v p t)) g0 rS
        erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
                               (pj (Vr K v) (Vr K v p t)) h0 
      PCauchy R X K v Hsnd K v R X t S Y f g0 h0"
(*  P_mod begin*)
apply(frule Vr_integral[of v], frule vp_ideal[of v],
       frule Vr_ring, frule pj_Hom[of "Vr K v" "vp K v"], assumption+,
       simp add:PolynRg.erH_mult[THEN sym, of R "Vr K v" X S 
          "Vr K v /r (Vr K v p t)" Y "pj (Vr K v) (Vr K v p t)" g0 h0],
       frule PolynRg.P_mod_diff[THEN sym, of R "Vr K v" X "Vr K v p t" S Y
        f "g0 rR h0"], assumption+, 
       frule PolynRg.is_Ring[of R], rule Ring.ring_tOp_closed,
       assumption+) (** P_mod done **) 
apply (simp add:pol_Cauchy_seq_def, rule conjI)
 apply (rule allI)

apply (frule_tac t = t and g = g0 and h = h0 and m = n in 
       PolynRg.P_mod_diffxxx5_2[of R "Vr K v" X _ S Y f],
       rule Vr_integral[of v], assumption+, simp add:vp_gen_nonzero,
       drule sym, simp add:vp_maximal, assumption+) 

apply (subst Hsnd_def)
apply (rule cart_prod_snd, assumption)
apply (rule conjI)
apply (subgoal_tac "n. deg R (Vr K v) X (Hsnd K v R X t S Y f g0 h0 n)  
                     an (deg_n R (Vr K v) X f)")
apply blast
apply (rule allI)
apply (frule Vr_integral[of v],
       frule_tac t = t and g = g0 and h = h0 and m = n in 
       PolynRg.P_mod_diffxxx5_4[of R "Vr K v" X _ S Y f], assumption+,
       simp add:vp_gen_nonzero,
       drule sym, simp add:vp_maximal, assumption+)
apply (subst PolynRg.deg_an[THEN sym], (erule conjE)+, assumption+)

apply (simp add:Hsnd_def)
apply (rule allI)
apply (subgoal_tac "n m. N < n  N < m 
  P_mod R (Vr K v) X (Vr K v p t (Vr K v) (an N))
     ( Hsnd K v R X t S Y f g0 h0 n ±R -aR (Hsnd K v R X t S Y f g0 h0 m))")
apply blast
apply ((rule allI)+, rule impI, (erule conjE)+)
apply (frule Vr_integral[of v], frule vp_gen_nonzero[of v t], assumption+)
apply (frule vp_maximal[of v])
apply (frule_tac t = t and g = g0 and h = h0 and m = n in 
      PolynRg.P_mod_diffxxx5_2[of R "Vr K v" X _ S Y f], assumption+, simp,
      assumption+) 
apply (frule_tac t = t and g = g0 and h = h0 and m = m in 
       PolynRg.P_mod_diffxxx5_2[of R "Vr K v" X _ S Y f], assumption+, simp,
       assumption+,
      frule_tac t = t and g = g0 and h = h0 and m = N in 
       PolynRg.P_mod_diffxxx5_2[of R "Vr K v" X _ S Y f], assumption+, simp,
       assumption+, 
      frule_tac x = "Hpr R (Vr K v) X t S Y f g0 h0 m" in cart_prod_snd[of _ 
       "carrier R" "carrier R"],
       frule_tac x = "Hpr R (Vr K v) X t S Y f g0 h0 N" in cart_prod_snd[of _ 
       "carrier R" "carrier R"],
      frule_tac x = "Hpr R (Vr K v) X t S Y f g0 h0 n" in cart_prod_snd[of _ 
       "carrier R" "carrier R"],
       thin_tac "Hpr R (Vr K v) X t S Y f g0 h0 n  carrier R × carrier R",
       thin_tac "Hpr R (Vr K v) X t S Y f g0 h0 m  carrier R × carrier R")
apply (frule PolynRg.is_Ring)
apply (case_tac "N = 0", simp add:r_apow_def)
apply (rule_tac p = "Hsnd K v R X t S Y f g0 h0 n ±R
               -aR (Hsnd K v R X t S Y f g0 h0 m)" in 
       PolynRg.P_mod_whole[of "R" "Vr K v" "X"], assumption+,
       frule Ring.ring_is_ag[of "R"], simp add:Hsnd_def,
       rule aGroup.ag_pOp_closed, assumption+, rule aGroup.ag_mOp_closed, 
       assumption+)

apply (frule_tac t = t and g = g0 and h = h0 and m = N and n = "n - N" in 
       PolynRg.P_mod_diffxxx5_3[of R "Vr K v" X _ S Y f], assumption+)
apply simp+
apply (erule conjE)+
apply (frule_tac t = t and g = g0 and h = h0 and m = N and n = "m - N" in 
       PolynRg.P_mod_diffxxx5_3[of R "Vr K v" X _ S Y f], assumption+)
apply simp apply (erule conjE)+
apply (thin_tac "P_mod R (Vr K v) X (Vr K v p (t^(Vr K v) N)) (fst 
    (Hpr R (Vr K v) X t S Y f g0 h0 N) ±R -aR (fst (Hpr R (Vr K v) X t S Y f g0 h0 n)))",
      thin_tac "P_mod R (Vr K v) X (Vr K v p (t^(Vr K v) N)) (fst 
    (Hpr R (Vr K v) X t S Y f g0 h0 N) ±R -aR (fst (Hpr R (Vr K v) X t S Y f g0 h0 m)))")
apply (frule Vr_ring[of v])
apply (simp only:Ring.principal_ideal_n_pow1[THEN sym])
apply (drule sym, simp, frule vp_ideal[of v])
apply (simp add:Ring.ring_pow_apow,
      frule_tac n = "an N" in vp_apow_ideal[of v], simp,
      frule Ring.ring_is_ag[of R],
      frule_tac x = "snd (Hpr R (Vr K v) X t S Y f g0 h0 n)" in 
        aGroup.ag_mOp_closed[of R], assumption)
apply (frule_tac I = "vp K v (Vr K v) (an N)" and 
      p = "(snd (Hpr R (Vr K v) X t S Y f g0 h0 N)) ±R
      -aR (snd (Hpr R (Vr K v) X t S Y f g0 h0 n))" in PolynRg.P_mod_minus[of R 
     "Vr K v" X], assumption+)

apply (rule aGroup.ag_pOp_closed, assumption+,
       simp add:aGroup.ag_p_inv aGroup.ag_inv_inv) 
 apply (frule Ring.ring_is_ag,
       frule_tac x = "-aR snd (Hpr R (Vr K v) X t S Y f g0 h0 N)" and 
       y = "snd (Hpr R (Vr K v) X t S Y f g0 h0 n)" in aGroup.ag_pOp_commute) 
 apply(rule aGroup.ag_mOp_closed, assumption+, simp,
       thin_tac "-aR snd (Hpr R (Vr K v) X t S Y f g0 h0 N) ±R
       snd (Hpr R (Vr K v) X t S Y f g0 h0 n) = snd (Hpr R (Vr K v) X t S Y f g0 h0 n) ±R
       -aR snd (Hpr R (Vr K v) X t S Y f g0 h0 N)")
apply (frule_tac I = "vp K v (Vr K v) (an N)" and 
       p = "snd (Hpr R (Vr K v) X t S Y f g0 h0 n) ±R
          -aR snd (Hpr R (Vr K v) X t S Y f g0 h0 N)" and 
       q = "snd (Hpr R (Vr K v) X t S Y f g0 h0 N) ±R
          -aR snd (Hpr R (Vr K v) X t S Y f g0 h0 m)" in PolynRg.P_mod_add[of 
          R "Vr K v" X], assumption+)
apply (rule aGroup.ag_pOp_closed, assumption+,
       rule aGroup.ag_mOp_closed, assumption+)
apply (rule aGroup.ag_pOp_closed, assumption+,
       rule aGroup.ag_mOp_closed, assumption+)
apply (frule_tac x = "snd (Hpr R (Vr K v) X t S Y f g0 h0 N)" in 
       aGroup.ag_mOp_closed, assumption+,
       frule_tac x = "snd (Hpr R (Vr K v) X t S Y f g0 h0 m)" in
       aGroup.ag_mOp_closed, assumption+,
       simp add:aGroup.pOp_assocTr43[of R] aGroup.ag_l_inv1 aGroup.ag_r_zero)
apply (simp add:Hsnd_def)
done

lemma (in Corps) H_Plimit_f:"valuation K v; Completev K;
     t  carrier (Vr K v); vp K v = Vr K v p t;
     PolynRg R (Vr K v) X; PolynRg S (Vr K v /r (Vr K v p t)) Y;
     f  carrier R; f  𝟬R; g0  carrier R; h0  carrier R; g0  𝟬R; 
     h0  𝟬R; 
     0 < deg S (Vr K v /r (Vr K v p t)) Y
             (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
               (pj (Vr K v) (Vr K v p t)) g0);
     0 < deg S (Vr K v /r (Vr K v p t)) Y
             (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
               (pj (Vr K v) (Vr K v p t)) h0);
     deg R (Vr K v) X h0 +
        deg S (Vr K v /r (Vr K v p t)) Y
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
           (pj (Vr K v) (Vr K v p t)) g0)   deg R (Vr K v) X f;
       
     rel_prime_pols S (Vr K v /r (Vr K v p t)) Y
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
                      (pj (Vr K v) (Vr K v p t)) g0)
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
                       (pj (Vr K v) (Vr K v p t)) h0);
      
     erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) f =
      erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
           (pj (Vr K v) (Vr K v p t)) g0 rS
        erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
           (pj (Vr K v) (Vr K v p t)) h0;
      
        deg R (Vr K v) X g0
         deg S (Vr K v /r (Vr K v p t)) Y
           (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
             (pj (Vr K v) (Vr K v p t)) g0);
      
      g  carrier R; h  carrier R;
        Plimit R X K v (Hfst K v R X t S Y f g0 h0) g; 
        Plimit R X K v (Hsnd K v R X t S Y f g0 h0) h;
        Plimit R X K v (λn. (Hfst K v R X t S Y f g0 h0 n) rR
                            (Hsnd K v R X t S Y f g0 h0 n)) (g rR h)
        Plimit R X K v (λn. (Hfst K v R X t S Y f g0 h0 n) rR
                              (Hsnd K v R X t S Y f g0 h0 n)) f"
apply(frule Vr_integral[of v], frule vp_ideal[of v],
       frule Vr_ring, frule pj_Hom[of "Vr K v" "vp K v"], assumption+,
       simp add:PolynRg.erH_mult[THEN sym, of R "Vr K v" X S 
          "Vr K v /r (Vr K v p t)" Y "pj (Vr K v) (Vr K v p t)" g0 h0])
apply(frule PolynRg.P_mod_diff[of R "Vr K v" X "Vr K v p t" S Y
        f "g0 rR h0"], assumption+, 
       frule PolynRg.is_Ring[of R], rule Ring.ring_tOp_closed,
       assumption+, simp) (** P_mod done **)
apply (simp add:PolynRg.erH_mult[of R "Vr K v" X S 
          "Vr K v /r (Vr K v p t)" Y "pj (Vr K v) (Vr K v p t)" g0 h0])
apply (frule PolynRg.is_Ring[of R]) 
apply (frule Hfst_PCauchy[of v R X S t Y g0 h0 f], assumption+, 
       frule Hsnd_PCauchy[of v R X S t Y g0 h0 f], assumption+) 
apply (subst pol_limit_def)
apply (rule conjI)
 apply (rule allI) 
 apply (rule Ring.ring_tOp_closed, assumption)
 apply (simp add:pol_Cauchy_seq_def, simp add:pol_Cauchy_seq_def) 
 apply (rule allI)
 apply (subgoal_tac "m>N. P_mod R (Vr K v) X (vp K v (Vr K v) (an N))
                   ((Hfst K v R X t S Y f g0 h0 m) rR (Hsnd K v R X t S Y f g0 h0 m)
                       ±R -aR f)")
apply blast

apply (rule allI, rule impI, frule Vr_integral[of v])
apply (frule_tac t = t and g = g0 and h = h0 and m = "m - Suc 0" in 
       PolynRg.P_mod_diffxxx5_1[of R "Vr K v" X _ S Y], assumption+,
       simp add:vp_gen_nonzero[of v],
       frule vp_maximal[of v], simp, assumption+)
apply ((erule conjE)+, simp del:npow_suc Hpr_Suc)
apply (frule Ring.ring_is_ag[of "R"])
apply (thin_tac "0 < deg S (Vr K v /r (Vr K v p t)) Y
       (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
               (pj (Vr K v) (Vr K v p t)) g0)",
       thin_tac "0 < deg S (Vr K v /r (Vr K v p t)) Y
             (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
               (pj (Vr K v) (Vr K v p t)) h0)",
       thin_tac "rel_prime_pols S (Vr K v /r (Vr K v p t)) Y
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
           (pj (Vr K v) (Vr K v p t)) g0)
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
           (pj (Vr K v) (Vr K v p t)) h0)",
       thin_tac "P_mod R (Vr K v) X (Vr K v p t) ( f ±R -aR g0 rR h0)",
       thin_tac "erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) f = 
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
           (pj (Vr K v) (Vr K v p t)) g0) rS
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
           (pj (Vr K v) (Vr K v p t)) h0)",
       thin_tac "deg R (Vr K v) X g0   deg S (Vr K v /r (Vr K v p t)) Y
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
             (pj (Vr K v) (Vr K v p t)) g0)",
       thin_tac "deg R (Vr K v) X h0 +  deg S (Vr K v /r (Vr K v p t)) Y
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
           (pj (Vr K v) (Vr K v p t)) g0)   deg R (Vr K v) X f",
        thin_tac "erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) (fst (Hpr R (Vr K v) X t S Y f g0 h0 m)) =
        erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) g0",
       thin_tac "erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) (snd (Hpr R (Vr K v) X t S Y f g0 h0 m)) =
        erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) h0",
       thin_tac "deg R (Vr K v) X (fst (Hpr R (Vr K v) X t S Y f g0 h0 m))
         deg S (Vr K v /r (Vr K v p t)) Y
           (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
             (pj (Vr K v) (Vr K v p t)) g0)",
       thin_tac "P_mod R (Vr K v) X (Vr K v p (t^(Vr K v) m))
        ( fst (Hpr R (Vr K v) X t S Y f g0 h0 (m - Suc 0)) ±R
             -aR (fst (Hpr R (Vr K v) X t S Y f g0 h0 m)))",
       thin_tac "deg R (Vr K v) X (snd (Hpr R (Vr K v) X t S Y f g0 h0 m)) +
        deg S (Vr K v /r (Vr K v p t)) Y
         (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
           (pj (Vr K v) (Vr K v p t)) g0)  deg R (Vr K v) X f",
       thin_tac "P_mod R (Vr K v) X (Vr K v p (t^(Vr K v) m))
         (snd (Hpr R (Vr K v) X t S Y f g0 h0 (m - Suc 0)) ±R
             -aR (snd (Hpr R (Vr K v) X t S Y f g0 h0 m)))")
apply (case_tac "N = 0", simp add:r_apow_def)
apply (rule_tac p = "(Hfst K v R X t S Y f g0 h0 m) rR (Hsnd K v R X t S Y f g0 h0 m)
               ±R -aR f" in PolynRg.P_mod_whole[of R "Vr K v" X], assumption+)
apply (simp add:Hfst_def Hsnd_def)
apply (frule_tac x = "Hpr R (Vr K v) X t S Y f g0 h0 m" in cart_prod_fst[of _ "carrier R" "carrier R"]) 
apply (frule_tac x = "Hpr R (Vr K v) X t S Y f g0 h0 m" in cart_prod_snd[of _ 
       "carrier R" "carrier R"])
apply (frule Ring.ring_is_ag[of R],
       rule aGroup.ag_pOp_closed, assumption)
 apply (rule Ring.ring_tOp_closed, assumption+) 
 apply (rule aGroup.ag_mOp_closed, assumption+)

apply (frule_tac g = "f ±R -aR (fst (Hpr R (Vr K v) X t S Y f g0 h0 m)) rR
       (snd (Hpr R (Vr K v) X t S Y f g0 h0 m))" and m = "N - Suc 0" and n = m in
       PolynRg.P_mod_n_m[of "R" "Vr K v" "X"], assumption+)
apply (frule_tac x = "Hpr R (Vr K v) X t S Y f g0 h0 m" in cart_prod_fst[of _ "carrier R" "carrier R"],
       frule_tac x = "Hpr R (Vr K v) X t S Y f g0 h0 m" in cart_prod_snd[of _ "carrier R" "carrier R"]) 

apply (rule aGroup.ag_pOp_closed, assumption+, rule aGroup.ag_mOp_closed, 
       assumption)
apply (rule Ring.ring_tOp_closed, assumption+)
apply (subst Suc_le_mono[THEN sym], simp)
apply assumption
apply (simp del:npow_suc)
apply (simp only:Ring.principal_ideal_n_pow1[THEN sym, of "Vr K v"])
apply (cut_tac n = N in an_neq_inf)
apply (subgoal_tac "an N  0") 
apply (subst r_apow_def, simp) apply (simp add:na_an)
apply (frule Ring.principal_ideal[of "Vr K v" t], assumption)
apply (frule_tac I = "Vr K v p t" and n = N in Ring.ideal_pow_ideal[of "Vr K v"], assumption+)
apply (frule_tac x = "Hpr R (Vr K v) X t S Y f g0 h0 m" in cart_prod_fst[of _ "carrier R" "carrier R"],
       frule_tac x = "Hpr R (Vr K v) X t S Y f g0 h0 m" in cart_prod_snd[of _ "carrier R" "carrier R"])

apply (thin_tac "PCauchy R X K v Hfst K v R X t S Y f g0 h0",
       thin_tac "PCauchy R X K v Hsnd K v R X t S Y f g0 h0")
apply (simp add:Hfst_def Hsnd_def)
apply (frule_tac x = "fst (Hpr R (Vr K v) X t S Y f g0 h0 m)" and y = "snd (Hpr R (Vr K v) X t S Y f g0 h0 m)" in Ring.ring_tOp_closed[of "R"],  assumption+)

apply (frule_tac  x = "(fst (Hpr R (Vr K v) X t S Y f g0 h0 m)) rR (snd (Hpr R (Vr K v) X t S Y f g0 h0 m))" in aGroup.ag_mOp_closed[of "R"], assumption+)
apply (frule_tac I = "Vr K v p t (Vr K v) N" and 
       p = "f ±R -aR (fst (Hpr R (Vr K v) X t S Y f g0 h0 m)) rR 
        (snd (Hpr R (Vr K v) X t S Y f g0 h0 m))" in 
       PolynRg.P_mod_minus[of R "Vr K v" X], assumption+)
apply (frule Ring.ring_is_ag[of "R"])
apply (rule aGroup.ag_pOp_closed, assumption+)
apply (simp add:aGroup.ag_p_inv, simp add:aGroup.ag_inv_inv,
       frule aGroup.ag_mOp_closed[of "R" "f"], assumption+)
apply (simp add:aGroup.ag_pOp_commute[of "R" "-aR f"])
apply (subst an_0[THEN sym])
apply (subst aneq_natneq[of _ "0"], thin_tac "an N  ", simp) 
done

theorem (in Corps) Hensel:"valuation K v; Completev K; 
    PolynRg R (Vr K v) X; PolynRg S ((Vr K v) /r (vp K v)) Y;
    f  carrier R; f  𝟬R; g'  carrier S; h'  carrier S;  
    0 < deg S ((Vr K v) /r (vp K v)) Y g';
    0 < deg S ((Vr K v) /r (vp K v)) Y h';
    ((erH R (Vr K v) X S ((Vr K v) /r (vp K v)) Y 
             (pj  (Vr K v) (vp K v))) f) =  g' rS h';
    rel_prime_pols S ((Vr K v) /r (vp K v)) Y g' h' 
  g h. g  carrier R  h  carrier R  
        deg R (Vr K v) X g  deg S ((Vr K v) /r (vp K v)) Y g' 
                  f = g rR h"
apply (frule PolynRg.is_Ring[of R "Vr K v" X],
       frule PolynRg.is_Ring[of S "Vr K v /r vp K v" Y],
       frule vp_gen_t[of v], erule bexE,
       frule_tac t = t in vp_gen_nonzero[of v], assumption)
apply (frule_tac t = t in Hensel_starter[of v R X S Y _ f g' h'], assumption+) 
apply ((erule exE)+, (erule conjE)+, rename_tac  g0 h0)
apply (frule Vr_ring[of v], frule Vr_integral[of v])
apply (rotate_tac 22, drule sym, drule sym, simp)
apply (frule vp_maximal[of v], simp)
apply (frule_tac mx = "Vr K v p t" in Ring.residue_field_cd[of "Vr K v"],
                 assumption)
apply (frule_tac mx = "Vr K v p t" in  Ring.maximal_ideal_ideal[of "Vr K v"],
          assumption)
apply (frule_tac I = "Vr K v p t" in Ring.qring_ring[of "Vr K v"], 
       assumption+)
apply (frule_tac B = "Vr K v /r (Vr K v p t)" and h = "pj (Vr K v) (Vr K v p t)" in PolynRg.erH_rHom[of R "Vr K v" X S _ Y], assumption+)
 apply (simp add:pj_Hom) 
apply (frule_tac ?g0.0 = g0 and ?h0.0 = h0 in Hfst_PCauchy[of v R X S _ Y _ _ 
       f], assumption+)
apply (frule_tac ?g0.0 = g0 and ?h0.0 = h0 in Hsnd_PCauchy[of v R X S _ Y _ _ 
       f], assumption+)
apply (frule_tac F = "λj. HfstK v R X t S Y f g0 h0 j" in PCauchy_Plimit[of v R X]
      , assumption+)
apply (frule_tac F = "λj. HsndK v R X t S Y f g0 h0 j" in PCauchy_Plimit[of v R X]
, assumption+)
apply ((erule bexE)+, rename_tac g0 h0 g h) 

apply (frule_tac F = "λj. HfstK v R X t S Y f g0 h0 j" and 
        G = "λj. HsndK v R X t S Y f g0 h0 j" and ?p1.0 = g and ?p2.0 = h 
       in P_limit_mult[of v R X], assumption+, rule allI)

apply (simp add:pol_Cauchy_seq_def) 
apply (simp add:pol_Cauchy_seq_def, assumption+)
apply (frule_tac t = t and ?g0.0 = g0 and ?h0.0 = h0 and g = g and h = h in 
       H_Plimit_f[of v _ R X S Y f], assumption+) 
apply (frule_tac F = "λn. (Hfst K v R X t S Y f g0 h0 n) rR (Hsnd K v R X t S Y f g0 h0 n)" and ?p1.0 = "g rR h" and d = "na (deg R (Vr K v) X g0 + deg R (Vr K v) X f)" in  P_limit_unique[of v R X _ _  _ f], assumption+)
apply (rule allI)
 apply (frule PolynRg.is_Ring[of R],
        rule Ring.ring_tOp_closed, assumption)
 apply (simp add:pol_Cauchy_seq_def)
 apply (simp add:pol_Cauchy_seq_def)
 apply (rule allI)
apply (thin_tac "Plimit R X K v (Hfst K v R X t S Y f g0 h0) g",
       thin_tac "Plimit R X K v (Hsnd K v R X t S Y f g0 h0) h",
       thin_tac "Plimit R X K v (λn. (Hfst K v R X t S Y f g0 h0 n) rR
                             (Hsnd K v R X t S Y f g0 h0 n)) (g rR h)",
       thin_tac "Plimit R X K v (λn. (Hfst K v R X t S Y f g0 h0 n) rR
                             (Hsnd K v R X t S Y f g0 h0 n)) f")
apply (subst PolynRg.deg_mult_pols1[of R "Vr K v" X], assumption+)

 apply (simp add:pol_Cauchy_seq_def, simp add:pol_Cauchy_seq_def,
        thin_tac "g' = erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) g0",
        thin_tac "h' = erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
         (pj (Vr K v) (Vr K v p t)) h0")
apply (subst PolynRg.deg_mult_pols1[THEN sym, of R "Vr K v" X], assumption+)
apply (simp add:pol_Cauchy_seq_def, simp add:pol_Cauchy_seq_def)

apply (frule_tac p1 = g0 in PolynRg.deg_mult_pols1[THEN sym, of R "Vr K v" X _         f], assumption+, simp)
apply (frule_tac x = g0 in Ring.ring_tOp_closed[of R _ f], assumption+)
apply (frule_tac p = "g0 rR f" in PolynRg.nonzero_deg_pos[of R "Vr K v" X],
          assumption+)
apply (frule_tac p = "g0 rR f" in PolynRg.deg_in_aug_minf[of R "Vr K v" X], 
       assumption+, simp add:aug_minf_def,
       simp add:PolynRg.polyn_ring_integral[of R "Vr K v" X],
       simp add:Idomain.idom_tOp_nonzeros[of R _ f],
       frule_tac p = "g0 rR f" in PolynRg.deg_noninf[of R "Vr K v" X],
       assumption+)       
apply (simp add:an_na)
apply (subst PolynRg.deg_mult_pols1[of "R" "Vr K v" "X"], assumption+,
       simp add:pol_Cauchy_seq_def, simp add:pol_Cauchy_seq_def)
apply (frule_tac  t = t and g = g0 and h = h0 and m = n in 
       PolynRg.P_mod_diffxxx5_4[of R "Vr K v" X _ S Y f], assumption+)
apply (erule conjE)

apply (frule_tac a = "deg R (Vr K v) X (fst (Hpr R (Vr K v) X t S Y f g0 h0 n))" and a' = "deg R (Vr K v) X g0" and b = "deg R (Vr K v) X (snd (Hpr R (Vr K v) X t S Y f g0 h0 n))" and b' = "deg R (Vr K v) X f" in aadd_plus_le_plus, assumption+)
 apply simp
apply (simp add:Hfst_def Hsnd_def)

apply (rule Ring.ring_tOp_closed, assumption+)
 apply (rotate_tac -1, drule sym)
apply (frule_tac F = "λj. HfstK v R X t S Y f g0 h0 j" and p = g and ad = "deg S
 (Vr K v /r (Vr K v p t)) Y (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y 
  (pj (Vr K v) (Vr K v p t)) g0)" in Plimit_deg1[of v R X], assumption+,
  simp add:pol_Cauchy_seq_def) 
apply (rule allI)
apply (frule_tac  t = t and g = g0 and h = h0 and m = n in 
      PolynRg.P_mod_diffxxx5_4[of R "Vr K v" X _ S Y f], assumption+,
      erule conjE)
apply (frule_tac i = "deg R (Vr K v) X (fst (Hpr R (Vr K v) X t S Y f g0 h0 n))" and
 j = "deg R (Vr K v) X g0" and k = "deg S (Vr K v /r (Vr K v p t)) Y
      (erH R (Vr K v) X S (Vr K v /r (Vr K v p t)) Y
               (pj (Vr K v) (Vr K v p t)) g0)" in ale_trans, assumption+)
 apply (subst Hfst_def, assumption+, blast)
done

end